gpt4 book ai didi

haskell - 了解 Haskell 类型签名

转载 作者:行者123 更新时间:2023-12-03 10:37:00 24 4
gpt4 key购买 nike

我正在自学 Haskell,我想知道以下类型签名:

Prelude> :t ($)
($) :: (a -> b) -> a -> b
Prelude>

我应该如何解释(不是双关语)?

一个半相似的结果也被证明是令人费解的:
Prelude> :t map
map :: (a -> b) -> [a] -> [b]
Prelude>

最佳答案

我将从 map 开始. map函数将操作应用于列表中的每个元素。如果我有

add3 :: Int -> Int
add3 x = x + 3

然后我可以将它应用到 Int 的整个列表中。使用 map :
> map add3 [1, 2, 3, 4]
[4, 5, 6, 7]

因此,如果您查看类型签名
map :: (a -> b) -> [a] -> [b]

你会看到第一个参数是 (a -> b) ,这只是一个接受 a 的函数并返回 b .第二个参数是 [a] ,它是 a 类型的值列表,以及返回类型 [b] , b 类型的值列表.所以用简单的英语, map function 将函数应用于值列表中的每个元素,然后将这些值作为列表返回。

这就是 map 的原因一个高阶函数,它接受一个函数作为参数并用它做一些事情。另一种看待 map的方式就是在类型签名上加一些括号来做
map :: (a -> b) -> ([a] -> [b])

所以你也可以把它看成是一个函数,从 a 转换一个函数。至 b进入 [a] 的函数至 [b] .

函数 ($)有类型
($) :: (a -> b) -> a -> b

并且像这样使用
> add3 $ 1 + 1
5

它所做的只是取右边的,在本例中为 1 + 1 ,并将其传递给左侧的函数,此处为 add3 .为什么这很重要?它有一个方便的固定性或运算符优先级,这使得它等同于
> add3 (1 + 1)

因此,右侧的任何内容在传递到左侧之前基本上都被包裹在括号中。这使它对于将多个函数链接在一起很有用:
> add3 $ add3 $ add3 $ add3 $ 1 + 1


> add3 (add3 (add3 (add3 (1 + 1))))

因为你不必关闭括号。

关于haskell - 了解 Haskell 类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22337214/

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