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)
答案 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
的函数,如果提供了第二个参数,它将第二个参数应用于返回的函数。