首页 文章

函数类型签名中的右关联性

提问于
浏览
0

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

1)因为 -> 被认为是右关联的,是否意味着它可以用类似的方式理解,例如4 ^(2 ^(3 ^ 2))?

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

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 中的相同类型,似乎 cd 可以用 ab 表示 . 在数学中,类似的任务可能非常简单,但我如何在Haskell中处理它?

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

1 回答

  • 5

    使用你的符号,在

    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

    因此,类型表达式中 -> 的右关联性不对应于函数评估中从右到左的计算顺序 . 事实上,功能评估是左关联的: myAdd 2 10(myAdd 2) 10 相同 .

相关问题