Haskell 如何评价这个签名?

How does Haskell evaluate this signature?

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

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

据我了解,括号表示它是一个函数?这难道不意味着 ggt_euklid 取值 Nat1 而 returns 取一个函数吗?

完整函数如下:

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

您已经正确理解了类型签名:它接受一个参数和 returns 一个函数。这就是 "multi-argument" 函数在 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 变量作为使用模式守卫的东西,但想法是一样的。

Would that not imply that ggt_euklid takes a value Nat1 and returns a function?

没有,它仍然意味着ggt_euklid接受一个Nat1类型的参数和return一个[=18=类型的函数],尽管如此,括号被省略了

箭头->总是右结合(没有括号时),即:

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,它总是return一个类型为Nat1 -> Nat1的函数首先,如果提供了第二个参数,它会应用第二个参数到 returned 函数。