1

对于这段 haskell 代码:

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

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

例如:什么是(Eq a)

4

1 回答 1

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 []
于 2013-01-13T04:51:46.277 回答