在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
是什么意思?
答案 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
通常,当您看到可折叠类型时,只需假装它是一个列表。