1

私の仕事はこの関数を再実装することです

divn :: Integer -> [Integer] -> [Integer]
divn _ [] = []
divn n (x:xs) | mod x n == 0 = x : divn n xs
              | otherwise = divn n xs

'foldr'を使用します。私がしたこと:

divn' _ [] = []
divn' n (x:xs) = foldr (\x -> if (mod x n == 0) (x:) ([]++)) [] xs

これでうまくいくと思いました。実際にはコンパイルすらしませんが、「入力の解析エラー」)」と表示されます。

エラーが見つからなかったので、「今は機能しているように」と書き直すことにしました...

if' True x _ = x
if' False _ x = x

divn' _ [] = []
divn' n (x:xs) = foldr (\x -> if' (mod x n == 0) (x:) ([]++)) [] xs

誰かがエラーがどこにあるか知っていますか?

ありがとう!

4

2 に答える 2

4

ifHaskellでthenとが必要です。else

(\x -> if (mod x n == 0) (x:) ([]++))

する必要があります

(\x -> if (mod x n == 0) then (x:) else id)
于 2012-07-14T13:24:57.743 に答える
3

Daniel Fischerが言ったことを除けば、個別のケースは必要ありません。再帰はなく、空のリストのケースはfoldrによって処理されます。あなたのコードでは、最初のxものは常に無視されます!正解は

divn' n xs = foldr (\x -> if x`mod`n == 0 then (x:) else id) [] xs

または、η-reductionによって、

divn' n = foldr (\x -> if x`mod`n == 0 then (x:) else id) []

もちろん、単純に行う方がはるかに慣用的です

divn'' n = filter ((==0) . (`mod`n))
于 2012-07-14T13:55:40.790 に答える