Haskell,输入参数,返回类型

时间:2013-01-13 04:33:22

标签: haskell

对于这段haskell代码:

isIn :: (Eq a) => [a] -> [a] -> Bool
needle `isIn` haystack = any (needle `isPrefixOf`) (tails haystack)

我相信这是一个功能定义。我如何理解输入参数是什么以及返回类型是什么?

例如:什么是(Eq a)

1 个答案:

答案 0 :(得分:3)

Eq就是所谓的typeclass。它声明了一些函数,在本例中是==和朋友,我们可以创建该类型类的实例,它们为==和其他函数提供定义。

这意味着当我们拥有Eq类型类的实例时,我们知道我们可以在其上使用==

这里的诀窍是,在我们的函数中,我们需要有类型,可以检查它们是否相等。如果我们刚刚[a] -> [a] -> Bool,那么我们就会遇到麻烦,因为我们刚刚承诺我们的实现可以在没有==运算符的情况下运行,但它没有。

因此我们使用=>为我们的函数定义添加上下文。只要 aa类型类的实例,它就会说“这将适用于任何Eq ”。这样,我们可以安全地使用==并知道我们所有的参数类型都会适当地实现它。

快速插图

这是一个错误:

doIfEqual :: a -> a -> (a -> a -> [a])
doIfEqual a b f = if a==b then f a b else []

但这是有效的,因为我们指定aEq

的实例
doIfEqual (Eq a) => a -> a -> (a -> a -> [a])
doIfEqual a b f = if a==b then f a b else []