繁体   English   中英

Haskell如何评估此签名?

[英]How does Haskell evaluate this signature?

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)

您已经正确理解了类型签名:它接受一个参数并返回一个函数。 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变量,可以将其用作模式防护,但是想法是相同的。

是否意味着ggt_euklid取值Nat1并返回函数?

,它仍然意味着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首先,如果提供了第二个参数,它适用于第二个参数返回的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM