gpt4 book ai didi

haskell - 仍然混淆带有多个箭头的类型签名如何工作

转载 作者:行者123 更新时间:2023-12-01 07:00:11 25 4
gpt4 key购买 nike

我查了一个 post之前,似乎明白。我知道

f :: a -> b -> c 

是 curry 的形式
g :: (a, b) -> c

但是随着类型签名的长度超过 2 个箭头,我再次感到困惑。
myscanr :: (a -> b -> b) -> b -> [a] -> [b]
myscanr op z [] = [z]
myscanr op z (x:xs) = op x (head qs) : qs
where
qs = myscanr op z xs

(a -> b -> b)[b]输入和输出?那么中间剩下的是什么?

最佳答案

从概念上讲,Haskell 中的函数总是只有一个参数。事实上,实际上签名:

myscanr :: (a ->  b -> b ) ->  b ->  [a] -> [b]

简称:
myscanr :: (a -> (b -> b)) -> (b -> ([a] -> [b]))

所以总是有一个参数,但结果也可以是一个函数,然后我们可以为该函数提供一个参数以获得一个值或另一个结果,所以这是某种“链接”。

您可以将其与 Python 之类的编程语言进行比较,在 Python 中,它不是具有接受多个参数的函数,而是每次接受单个参数。例如:
# python

def add(x):
def addx(y):
return x + y
return addx

所以这里我们有一个函数 add .我们可以用一个参数来调用它 x .如果我们这样做,例如 x=4 ,然后它将返回另一个函数(其中 x 是作用域)。只有当我们然后使用参数(例如 y=3 )调用该函数时,我们才会得到结果,例如:
>>> add(4)
<function add.<locals>.addx at 0x7f1c519e7b70>
>>> add(4)(3)
7

在 Haskell 中,这个模型是标准的:每个函数只接受一个参数。但既然是这样,语法就可以改进。而不是必须写 ((myscanr((+)))(0))([1, 4, 2, 5]) ,我们可以写 myscanr (+) 0 [1, 4, 2, 5] , 并且 Haskell 会自动将其解释为带有 myscanr 的函数调用作为函数和 (+)作为参数,另一个函数调用与作为函数的前一个调用的结果和 0作为参数,然后使用作为函数的另一个函数调用与 [1, 4, 2, 5] 的前一次调用的结果作为参数。

由于在语法上看起来有点像我们调用了三个参数,可以说 (a -> b -> b) , b[a]是“三个参数”的类型。但严格来说,这是错误的。

关于haskell - 仍然混淆带有多个箭头的类型签名如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50825036/

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