【发布时间】:2017-09-19 05:37:21
【问题描述】:
我正在尝试编写一个函数来确定一个元素是否存在于列表中,这两者都是由用户提供的。我认为递归解决方案是最好的。这就是我所拥有的:
isElement :: a -> [b] -> Bool
isElement a [] = False
isElement a (x:xs) = if a == x then True
else isElement a xs
但它无法编译。错误是“无法将预期类型 -a' 与实际类型 -b' 匹配”。我不知道这意味着什么或如何解决问题。
【问题讨论】:
-
您的类型签名错误。
==要求其操作数具有相同的类型,但您有a :: a和x :: b。 -
不只是任何类型;
a需要是Eq类型类的实例:isElement :: Eq a => a -> [a] -> Bool。 -
在
if附近使用True或False时,您应该始终保持警惕。通常这意味着逻辑可以在没有if的情况下更直接地表达。在这种情况下,这是真的。您可以将第二个等式的主体写为(a == x) || isElement a xs。 -
我猜这个问题是为了学习,否则
elem是一个很好的功能。