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 函数。
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 函数。