Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell如何评估此签名?_Haskell_Signature_Currying_Partial Application - Fatal编程技术网

Haskell如何评估此签名?

Haskell如何评估此签名?,haskell,signature,currying,partial-application,Haskell,Signature,Currying,Partial Application,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) ggt_euklid x y |x==y=x

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)
ggt_euklid x y
|x==y=x
|x> y=ggt_euklid(x-y)y

|您已经正确理解了类型签名:它接受一个参数并返回一个函数。这就是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)
ggt_euklid::Nat1->(Nat1->Nat1)
ggt_euklid x=\y->result
其中结果| x==y=x
|x>y=ggt_euklid(x-y)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)
ggt_euklid::Nat1->(Nat1->Nat1)
ggt_euklid x=\y->result
其中结果| x==y=x
|x>y=ggt_euklid(x-y)y
|x
在这里,我介绍了这个毫无意义的
result
变量,作为使用模式保护的工具,但其思想是相同的

这是否意味着ggt_euklid接受一个值Nat1并返回一个 功能

No,它仍然意味着
ggt_euklid
接受一个类型为
Nat1
的参数,并返回类型为
Nat1->Nat1
的函数,即使括号被省略

箭头
->
始终是右关联性(当没有括号时),即:

相当于

Nat1 -> (Nat1 -> Nat1)
它与函数应用程序相对应,始终保持左关联性。(无括号时)例如:

ggt_euklid 1 2
相当于

(ggt_euklid 1) 2
这里

因此,无论一个或两个参数是否应用于
ggt_euklid
,它总是首先返回
Nat1->Nat1
类型的函数,如果提供了第二个参数,它将第二个参数应用于返回的函数

这是否意味着ggt_euklid接受一个值Nat1并返回一个 功能

No,它仍然意味着
ggt_euklid
接受一个类型为
Nat1
的参数,并返回类型为
Nat1->Nat1
的函数,即使括号被省略

箭头
->
始终是右关联性(当没有括号时),即:

相当于

Nat1 -> (Nat1 -> Nat1)
它与函数应用程序相对应,始终保持左关联性。(无括号时)例如:

ggt_euklid 1 2
相当于

(ggt_euklid 1) 2
这里


因此,无论一个或两个参数是否应用于
ggt_euklid
,它总是首先返回
Nat1->Nat1
类型的函数,如果提供了第二个参数,它将第二个参数应用于返回的函数

“括号表示它是一个函数?”否,
->
表示它是一个函数。“括号表示它是一个函数”的可能重复项?否,
->
表示它是一个函数。的可能重复项