对于这段haskell代码:
isIn :: (Eq a) => [a] -> [a] -> Bool
needle `isIn` haystack = any (needle `isPrefixOf`) (tails haystack)
我相信这是一个功能定义。我如何理解输入参数是什么以及返回类型是什么?
例如:什么是(Eq a)
?
答案 0 :(得分:3)
Eq
就是所谓的typeclass。它声明了一些函数,在本例中是==
和朋友,我们可以创建该类型类的实例,它们为==
和其他函数提供定义。
这意味着当我们拥有Eq
类型类的实例时,我们知道我们可以在其上使用==
。
这里的诀窍是,在我们的函数中,我们需要有类型,可以检查它们是否相等。如果我们刚刚[a] -> [a] -> Bool
,那么我们就会遇到麻烦,因为我们刚刚承诺我们的实现可以在没有==
运算符的情况下运行,但它没有。
因此我们使用=>
为我们的函数定义添加上下文。只要 a
是a
类型类的实例,它就会说“这将适用于任何Eq
”。这样,我们可以安全地使用==
并知道我们所有的参数类型都会适当地实现它。
快速插图
这是一个错误:
doIfEqual :: a -> a -> (a -> a -> [a])
doIfEqual a b f = if a==b then f a b else []
但这是有效的,因为我们指定a
是Eq
doIfEqual (Eq a) => a -> a -> (a -> a -> [a])
doIfEqual a b f = if a==b then f a b else []