我的任务是重新实现这个功能
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
有谁知道错误在哪里?
谢谢!
答案 0 :(得分:4)
if
在Haskell中需要then
和else
,
(\x -> if (mod x n == 0) (x:) ([]++))
应该是
(\x -> if (mod x n == 0) then (x:) else id)
答案 1 :(得分: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))