首页 > 解决方案 > Haskell 如何评估这个签名?

问题描述

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)

标签: haskellsignaturecurryingpartial-application

解决方案


您已经正确理解了类型签名:它接受一个参数并返回一个函数。这就是 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的变量作为使用模式防护的东西,但想法是一样的。


推荐阅读