我遇到了有关Haskell的问题,我试图将一个函数仅在列表中设置为偶数的一半,然后返回最终列表,仅保留修改后的偶数(减半),其余元素保持不变。

但是,当我尝试编译代码时,出现了一个错误,提示“错误:解析输入'if'上的错误”,但我找不到解决方案。

halfEvens :: [ Int ] -> [ Int ]
halfEvens xs = [x|x<-xs]
                if x mod 2 == 0
                the x = x / 2
                else
                x = x

最佳答案

尽可能多地保留原始代码/意图,

halfEvens xs = [x | x <- xs, x <- [   -- instead of x = ...
                 if x `mod` 2 == 0
                   then {- x = -} x `div` 2
                   else {- x = -} x ]]

其类型推导为halfEvens :: Integral t => [t] -> [t]

有趣的是,我们可以使用x <- [...]构造在此处使用相同的变量名;它只是被蒙上阴影。没关系,因为我们只对新值感兴趣。这样,尽管Haskell中没有更新变量,但我们在心理上将其视为变量“更新”。

08-04 04:51