对于这段 haskell 代码:
isIn :: (Eq a) => [a] -> [a] -> Bool
needle `isIn` haystack = any (needle `isPrefixOf`) (tails haystack)
这是我相信的函数定义。我如何理解输入参数是什么以及返回类型是什么?
例如:什么是(Eq a)
?
对于这段 haskell 代码:
isIn :: (Eq a) => [a] -> [a] -> Bool
needle `isIn` haystack = any (needle `isPrefixOf`) (tails haystack)
这是我相信的函数定义。我如何理解输入参数是什么以及返回类型是什么?
例如:什么是(Eq a)
?
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 []