unfoldr
は割り当てが何を意味するのか、あなたはそれが別のものを涙ながらつのリストを構築、つまり、hylomorphismとしてfoldr
を使用している場合、あなたはfoldr
を使用して、これを書くことができ、おそらくですがダウン。
digits :: Int -> [Int]
digits n = snd $ foldr go (n, []) places where
places = replicate num_digits()
num_digits | n > 0 = 1 + floor (logBase 10 $ fromIntegral n)
| otherwise = 0
go() (n, ds) = let (q,r) = n `quotRem` 10 in (q, r : ds)
効果的に、私たちがここでやっていることは「マップを持つ状態」としてfoldr
を使用しています。私たちは事前にその数字が何でないかをlog35を使って出力する必要があるので、数字の代わりに ユニット(()
)の値を使用します。
先生がちょうどトップレベルでfoldr
を持つためにこだわるなら、あなたはgo
は、部分的に作ると離れて を得ることができますが:
digits' :: Int -> [Int]
digits' n = foldr go [n] places where
places = replicate num_digits()
num_digits | n > 0 = floor (logBase 10 $ fromIntegral n)
| otherwise = 0
go() (n:ds) = let (q,r) = n `quotRem` 10 in (q:r:ds)
これは、非正の数にわずかに異なる振る舞いを持っています
>>> digits 1234567890
[1,2,3,4,5,6,7,8,9,0]
>>> digits' 1234567890
[1,2,3,4,5,6,7,8,9,0]
>>> digits 0
[]
>>> digits' 0
[0]
>>> digits (negate 1234567890)
[]
>>> digits' (negate 1234567890)
[-1234567890]
あなたは本当に「unfoldr」を使用できませんか?それとも何か他に?すべての折り畳み関数は、折り畳まれるための入力としていくつかのリスト(または 'Foldable')を必要とします... – Alec
アレック、私は展開に精通していませんでした*。私はおそらく、それは行く方法です(そして、問題の要件が実際に意味するもの)。ありがとうございました。 –
'list_digits = unfoldr(\ i - > i == 0、それ以外のものは(q、r)= quotRem i 10 Just(r、q))'で数字を後ろに簡単に戻すことができます。 – Alec