gpt4 book ai didi

== 和 elem 的 Haskell 类型签名

转载 作者:行者123 更新时间:2023-12-02 21:28:19 25 4
gpt4 key购买 nike

在 GHCi 中,执行以下产量:

:t (==) 

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

:t elem

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

我对从 a 到 a,然后从 a 到 Bool 的箭头感到困惑。是因为 == 或 elem 是柯里化(Currying)函数吗?

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

最佳答案

是的,运算符是柯里化(Currying)的。让我们暂时忽略上下文(=> 之前的类型部分)。

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

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

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

也就是说,它是一个函数,给定一个a,返回另一个函数,该函数又接受一个a并给出一个Bool 。它返回仅当其参数等于第一个 a 时才为 true 的函数。

(我们将设置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

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

关于== 和 elem 的 Haskell 类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34258501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com