Lambda表达式解析错误“)”

时间:2012-07-14 13:23:37

标签: haskell ghc ghci

我的任务是重新实现这个功能

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

有谁知道错误在哪里?

谢谢!

2 个答案:

答案 0 :(得分:4)

if在Haskell中需要thenelse

(\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))