Haskell如何评估此签名?

时间:2018-11-21 23:17:28

标签: haskell signature currying partial-application

ggt_euklid :: Nat1 -> (Nat1 -> Nat1)

我正在尝试学习部分应用程序,我知道在这种情况下,如果省略括号,我将得到相同的结果,但是我不知道应该如何评估此签名。

据我了解,括号表示它是一个函数吗?那不是暗示ggt_euklid取值Nat1并返回一个函数吗?

下面是完整的功能:

ggt_euklid x y
| x == y = x
|x>y =ggt_euklid(x-y) y 
|x<y =ggt_euklid x (y-x)

2 个答案:

答案 0 :(得分:4)

您已经正确理解了类型签名:它接受一个参数并返回一个函数。 Haskell中的“多参数”函数就是这样工作的:通过咖喱化。您可以通过尝试以下等效实现来查看实际效果:

ggt_euklid :: Nat1 -> (Nat1 -> Nat1)
ggt_euklid x = \y -> result
  where result | x == y = x
               | x > y = ggt_euklid (x-y) y 
               | x < y = ggt_euklid x (y-x)

在这里,我已经介绍了这个毫无意义的result变量,以作为您的模式防护对象使用,但是想法是相同的。

答案 1 :(得分:2)

  

是否暗示ggt_euklid取值Nat1并返回a   功能?

,它仍然暗示ggt_euklid接受类型为Nat1的一个参数并返回类型为Nat1->Nat1的函数,即使

箭头->始终是右关联性(当没有括号时),即:

Nat1 -> Nat1 -> Nat1 

等同于

Nat1 -> (Nat1 -> Nat1)
与功能应用程序相对应的

始终是左关联性。 (如果没有括号),例如:

ggt_euklid 1 2

等效于

(ggt_euklid 1) 2

这里

(ggt_euklid 1) ~ Nat1 -> Nat1

(ggt_euklid 1) 2 ~ Nat1

因此,无论是对ggt_euklid应用一个还是两个参数,它总是首先返回类型为Nat1 -> Nat1的函数,如果提供了第二个参数,它将第二个参数应用于返回的函数。