繁体   English   中英

==和elem的Haskell类型签名

[英]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 aa必须是支持平等类型。

至于elemt ,这可能会让你现在完全理解。 我会给你一点点。 因为上下文

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

我们知道t必须是Foldable 列表是可折叠的,并且可折叠并不比“具有toList方法”更多。 所以你可以阅读elem

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM