haskell中的冗余if语句警告

haskell中的冗余if语句警告,haskell,if-statement,warnings,Haskell,If Statement,Warnings,所以我在学习教程,到目前为止我绝对喜欢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 最初有两个警

所以我在学习教程,到目前为止我绝对喜欢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是个新手,看不到明显的解决办法。有人能告诉我什么样的代码更改可以保持函数正常工作,同时删除编译器警告吗?

在没有类型注释的情况下,将上一个定义键入
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

它有正确的类型

如果x==y,则为True,否则acc
x==y | | acc

编译器警告或编译器错误相同?@MattFenwick在最后一个输入函数之前,它们只是警告,但最后一个是错误,不会编译。你能给出一个可重复的示例吗?我用
ghc-Wall
尝试了你的第一个函数,但没有收到任何警告。@maksenov好吧,我正在eclipse中使用eclipseFP插件编写它,我正在windows系统上工作。这就是你没有得到警告的原因吗?另外,警告只是eclipse在它下面加了一条黄线,如果我没有弄错的话,我认为这更准确地描述为“HLint”的建议。@Asaf HLint基本上被认为是Haskellers的福音。这当然可以解释为什么会有错误,但我如何删除警告而不导致此错误或任何其他错误?编辑:现在看来答案是对的,谢谢you@Asaf--此代码
elem'y=foldl(\acc x->x==y)False
是否会引起警告?很遗憾,我现在无法检查它,但我会在回到我的计算机时检查它,谢谢您的帮助它的类型正确,但行为与
elem
不同
elem'[3,1]3
产生
False
;由于累加器被忽略,这个函数本质上与
elem'y xs=last xs==y
@DanBurton相同——我将这个问题解释为
如何编译它/不给我警告?
。。。。我甚至没有考虑过写一个有意义的函数的观点。你认为我应该修改我的答案吗?我对此不太确定。切换到
foldr
也可以在无限列表上工作
elem'y=foldr(\x acc->x==y|acc)False
elem'3[1..]==>True
这确实是HLint提出的建议;不确定Eclipse为什么会删除此信息。谢谢您的正确答案,是的,我不知道Eclipse为什么不包含此信息。不过我知道,EclipseFP并不是自动随HLint提供的,我必须运行cabal install HLint(或类似的程序)才能安装它。所以,当我说eclipse从HLint获取信息时,也许我说错了。如果是这样的话,我很抱歉。