gpt4 book ai didi

haskell - 函数类型签名中的右结合性

转载 作者:行者123 更新时间:2023-12-05 09:20:46 25 4
gpt4 key购买 nike

我很难理解 Haskell 中类型签名背后的原因。

1) 因为 -> 据说是右结合的,这是否意味着它可以像 4^(2^(3^2)) 这样的方式来理解?

2) 使用简单函数的类型签名来表达我的疑问(为了解释我的理解方式,我将使用 a,b,c 而不是 Num a => aInt:

myAdd :: a -> b -> c
myAdd x y = x+y

意思是函数接受参数a,返回函数接受b,最后返回c

但它可以重写为:

myAdd :: (a->(b->c))

由于大多数学习资料都指出我们示例中的 c 是函数 myAdd 的结果,为什么根据括号的使用它表明第一个“操作”是 b-> c?我如何从该类型签名中推断出执行操作的顺序?

3) 我被赋予了一项任务来实现

map f xs 

使用 foldr(.)(:) 结果:

map f xs = foldr ((:) . f) [] xs

我对理解上述函数的工作没有任何问题,但我们又来了——类型签名。如果我们假设,名称是统一的,因此 a 类型在所有合约中代表相同的类型,似乎 cd 可以表示在 ab 方面。在数学中,类似的任务可能非常简单,但我如何在 Haskell 中处理它?<​​/p>

map :: (a -> b) -> [a] -> [b]
foldr :: (a -> c -> c) -> c -> [a] -> c
(:) :: b -> ([b] -> [b])
(.) :: (b -> d) -> (a -> b) -> a -> d

最佳答案

使用你的符号,在

myAdd :: a -> b -> c
myAdd x y = x+y

您正确地将类型解释为 a -> (b->c) 但随后您继续建议 b -> c 中的计算以某种方式完成首先。

当像 myAdd 2 10 这样的东西被求值时,函数求值是从左到右的。

1) 首先评估 myAdd 2。此评估的结果是将给定数字 y 发送到 2 + y 的函数。实际上,myAdd 的定义与

相同
myAdd x = \y -> x+y

2) 然后将最后一个函数应用于参数 10 以产生 2 + 10 = 12

因此,类型表达式-> 的右结合性不对应于函数计算中从右到左的计算顺序em>。事实上,函数求值是左结合的:myAdd 2 10(myAdd 2) 10 相同。

关于haskell - 函数类型签名中的右结合性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36143423/

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