[英]Haskell type signature for == and elem
在GHCi中,执行以下收益:
:t (==)
(==) :: Eq a => a -> a -> Bool
要么
:t elem
elem :: (Eq a, Foldable t) => a -> t a -> Bool
我对箭头从a到a,然后是a到Bool感到困惑。 是因为==或elem是一个curry函数?
elem的类型签名与==非常相似,除了额外的t。 ta
in :t elem
是什么意思?
是的,运营商是咖喱的。 让我们忽略一秒钟的上下文( =>
之前的类型部分)。
(==) :: a -> a -> Bool
(->)
与右侧相关联,因此这意味着:
(==) :: a -> (a -> Bool)
也就是说,它是一个函数,在给定a
,返回另一个函数,而该函数又取a
并给出一个Bool
。 它返回的函数只有在其参数等于第a
时才为真。
(我们将设置NoMonomorphismRestriction
,否则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
必须是支持平等类型。
至于elem
的t
,这可能会让你现在完全理解。 我会给你一点点。 因为上下文
(Eq a, Foldable t) => ...
我们知道t
必须是Foldable
。 列表是可折叠的,并且可折叠并不比“具有toList
方法”更多。 所以你可以阅读elem
:
elem :: (Eq a) => a -> [a] -> Bool
通常,当您看到可折叠类型时,只需假装它是一个列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.