==和elem的Haskell类型签名

时间:2015-12-14 01:30:59

标签: haskell typeclass

在GHCi中,做到以下收益:

:t (==) 

(==) :: Eq a => a -> a -> Bool

:t elem

elem :: (Eq a, Foldable t) => a -> t a -> Bool

我对箭头从a到a,然后是a到Bool感到困惑。 是因为==或elem是一个curried函数吗?

elem的类型签名与==非常相似,除了额外的t。 t a中的:t elem是什么意思?

1 个答案:

答案 0 :(得分:7)

是的,运营商是咖喱的。让我们忽略一秒钟的上下文(=>之前的类型部分)。

(==) :: a -> a -> Bool

(->)与右侧相关联,因此这意味着:

(==) :: a -> (a -> Bool)

也就是说,它是一个函数,给定一个a,返回另一个函数,该函数依次取a并给出Bool。它返回的函数只有在其参数等于第一个a时才为真。

(我们会设置NoMonomorphismRestriction因为否则会因为没有充分理由而引起额外的混淆)

ghci> :set -XNoMonomorphismRestriction
ghci> let f = (==) 1
ghci> f 1
True
ghci> f 2
False
-- or just
ghci> (==) 1 2
False

=>)之前的部分对类型设置约束。 Eq a表示a必须是支持相等的类型。

对于t中的elem,您现在可能需要完全了解这一点。我会给你一点点。由于上下文

(Eq a, Foldable t) => ...

我们知道t必须是Foldable。列表是可折叠的,可折叠并不比“有toList方法”更多。因此,您可以将elem视为:

elem :: (Eq a) => a -> [a] -> Bool

通常,当您看到可折叠类型时,只需假装它是一个列表。