我正在尝试学习 Haskell,所以我尝试了这个:
$ ghci
GHCi, version 8.10.7: https://www.haskell.org/ghc/ :? for help
Prelude> :set +m
Prelude> let element :: (Eq a) => [a] -> a -> Bool
Prelude| element [] _ = False
Prelude| element [x:_] x = True
Prelude| element [_:xs] x = element xs x
Prelude|
<interactive>:4:14: error:
• Conflicting definitions for ‘x’
Bound at: <interactive>:4:14
<interactive>:4:19
• In an equation for ‘element’
Prelude>
那么在第 4 行,为什么它不只使用第一个绑定和强制等效呢?这显然是一个玩具问题;我知道我可以导入列表函数并使用
element = flip elem
我的下一次尝试将使用警卫......
Stackoverflow 不会发布此内容,除非我包含更多“详细信息” - 让我知道我缺少哪些详细信息,我将在评论中添加它们。
x
不是变量;这是一个模式。模式在单个定义中必须是唯一的,这样分配给名称的值就不会含糊不清。您所询问的统一类型可能比避免明确的解决方法更复杂。
如果您想检查第一个参数的头部是否等于第二个参数,请使用单独的模式并在防护或定义本身中显式比较它们。
let element :: (Eq a) => [a] -> a -> Bool
element [] _ = False
element (x:xs) y | x == y = True
| otherwise = element xs x