所以我正在关注教程Learn you a Haskell for Great Good!,到目前为止,我非常喜欢Haskell。但是在本教程中提到的一个函数中,我收到一条警告,即if语句是多余的。
编辑:让我明白一下,该函数的意图是与elem函数的工作方式完全相同(默认情况下提供的是Haskell)。
这是原始功能:
elem' :: (Eq a) => a -> [a] -> Bool
elem' y ys = foldl (\acc x -> if x == y then True else acc) False ys
最初有两个警告,一个是eta减少,所以我从函数名的开头和结尾删除了ys到达:
elem' :: (Eq a) => a -> [a] -> Bool
elem' y = foldl (\acc x -> if x == y then True else acc) False
现在我尝试将功能减少到以下内容,这会导致错误:
elem' :: (Eq a) => a -> [a] -> Bool
elem' y = foldl (\acc x -> x == y)
我认为我对Haskell只是一个新手,看不出明显的解决方案。有人能告诉我哪些代码更改会使函数正常工作并删除编译器警告吗?
答案 0 :(得分:10)
if x == y then True else acc
与x == y || acc
相同。
答案 1 :(得分:4)
在没有类型注释的情况下将最后一个定义键入GHCi
:
Prelude> let elem' y = foldl (\acc x -> x == y)
Prelude> :t elem'
elem' :: (Eq b) => b -> Bool -> [b] -> Bool
它与您声明的类型不符。
你最后忘记了False
!如果你把它添加到:
Prelude> let elem' y = foldl (\acc x -> x == y) False -- note the False at the end
Prelude> :t elem'
elem' :: (Eq b) => b -> [b] -> Bool
它的类型正确!