当前位置:  开发笔记 > 编程语言 > 正文

==和elem的Haskell类型签名

如何解决《==和elem的Haskell类型签名》经验,为你挑选了1个好方法。

在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.是什么t a:t elem意思?



1> luqui..:

是的,运营商都是咖喱.让我们忽略一秒钟的背景(之前类型的部分=>).

(==) :: 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必须是支持相等的类型.

至于tin elem,这可能有点先进,让你现在完全理解.我会给你一点点.因为上下文

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

我们知道t必须这样做Foldable.列表是可折叠的,可折叠并不比"有toList方法"更多.所以你可以读elem作:

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

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


@Boon确实它是一个双参数函数,但是由于你提到的currying,这与返回函数的函数相同!考虑`fxy = x + y` - 这实际上与`gx =(\ y - > x + y)`相同.同样,`elem`对一个参数不能做任何有用的事情,所以它返回一个需要给它的"第二个"参数的新函数.
推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有