haskell中的冗余if语句警告

时间:2011-11-08 14:20:13

标签: haskell if-statement warnings

所以我正在关注教程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只是一个新手,看不出明显的解决方案。有人能告诉我哪些代码更改会使函数正常工作并删除编译器警告吗?

2 个答案:

答案 0 :(得分:10)

if x == y then True else accx == 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

它的类型正确!