我很难理解Haskell中类型签名背后的原因 .
1)因为 ->
被认为是右关联的,是否意味着它可以用类似的方式理解,例如4 ^(2 ^(3 ^ 2))?
2)使用简单函数的类型签名来表达我的疑虑(解释我理解它的方式,我将使用 a
, b
, c
而不是 Num a => a
或 Int
):
myAdd :: a -> b -> c
myAdd x y = x+y
这意味着函数接受参数 a
并返回带有 b
的函数,最后返回 c
但它可以重写为:
myAdd :: (a->(b->c))
由于大多数学习材料都说明在我们的例子中 c
是函数myAdd的结果,为什么根据括号的使用它表明第一个'operation'是 b->c
?如何从该类型签名推断出执行操作的顺序?
3)我被赋予了执行任务
map f xs
使用 foldr
, (.)
和 (:)
导致:
map f xs = foldr ((:) . f) [] xs
我对理解上述功能的工作没有任何问题,但我们再来一次 - 键入签名 . 如果我们假设,这些名称是统一的,那么类型 a
代表所有 Contract 中的相同类型,似乎 c
和 d
可以用 a
和 b
表示 . 在数学中,类似的任务可能非常简单,但我如何在Haskell中处理它?
map :: (a -> b) -> [a] -> [b]
foldr :: (a -> c -> c) -> c -> [a] -> c
(:) :: b -> ([b] -> [b])
(.) :: (b -> d) -> (a -> b) -> a -> d
1 回答
使用你的符号,在
你正确地将类型解释为
a -> (b->c)
,但接着建议b -> c
中的计算以某种方式首先完成 .当评估
myAdd 2 10
之类的东西时,功能评估从左到右 .1)首先评估
myAdd 2
. 此评估的结果是将给定数字y
发送到2 + y
的函数 . 实际上,myAdd
的定义与之相同2)然后将最后一个函数应用于参数
10
以产生2 + 10 = 12
因此,类型表达式中
->
的右关联性不对应于函数评估中从右到左的计算顺序 . 事实上,功能评估是左关联的:myAdd 2 10
与(myAdd 2) 10
相同 .