Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.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_Currying - Fatal编程技术网

Haskell 哈斯克尔咖喱

Haskell 哈斯克尔咖喱,haskell,currying,Haskell,Currying,我在Haskell中手动编写了一个currying函数,如下所示。 curry f=\x y->f(x,y) 然后我使用这个max(x,y)=如果x>y,那么x else y作为f,我编写max1=curry max来获得curry函数 但这是不允许的。为什么错了?您遇到了,这限制了Haskell可以推断多态类型 不“看起来”像没有命名参数的函数的绑定不能具有多态类型。问题在于max函数确实有一个多态类型(它适用于Ord类中的任何类型o),这迫使类型系统为max1选择一个特定的可订购类型。由于没

我在Haskell中手动编写了一个currying函数,如下所示。
curry f=\x y->f(x,y)
然后我使用这个
max(x,y)=如果x>y,那么x else y
作为f,我编写
max1=curry max
来获得curry函数

但这是不允许的。为什么错了?

您遇到了,这限制了Haskell可以推断多态类型

不“看起来”像没有命名参数的函数的绑定不能具有多态类型。问题在于
max
函数确实有一个多态类型(它适用于
Ord
类中的任何类型
o
),这迫使类型系统为
max1
选择一个特定的可订购类型。由于没有默认类型可拾取,它告诉您类型变量是不明确的

有三种方法可以避免此限制。正如您已经看到的,其中之一是使参数显式,使整个绑定看起来像一个函数:

max1 x y = curry max x y
另一种方法是添加显式类型签名:

max1 :: Ord o => o -> o -> o
max1 = curry max
最后,您还可以通过在模块顶部添加编译器指令来关闭限制:

{-# LANGUAGE NoMonomorphismRestriction #-}
其中,最惯用的选择是添加类型签名一般来说,每个顶级名称都应该有一个明确的类型签名。这不是强制性的,但被认为是好的样式,因为除了避免单态性问题外,它还有助于捕获更多错误并使错误消息更易于阅读。如果打开GHC中的所有警告(使用
-Wall
标志),它将警告您没有类型签名的顶级名称。

您遇到了,这限制了Haskell可以推断多态类型

不“看起来”像没有命名参数的函数的绑定不能具有多态类型。问题在于
max
函数确实有一个多态类型(它适用于
Ord
类中的任何类型
o
),这迫使类型系统为
max1
选择一个特定的可订购类型。由于没有要选择的默认类型,它告诉您类型变量是不明确的

有三种方法可以避免此限制。正如您已经看到的,其中之一是使参数显式,使整个绑定看起来像一个函数:

max1 x y = curry max x y
另一种方法是添加显式类型签名:

max1 :: Ord o => o -> o -> o
max1 = curry max
最后,您还可以通过在模块顶部添加编译器指令来关闭限制:

{-# LANGUAGE NoMonomorphismRestriction #-}


其中,最惯用的选择是添加类型签名一般来说,每个顶级名称都应该有一个明确的类型签名。这不是强制性的,但被认为是好的样式,因为除了避免单态性问题外,它还有助于捕获更多错误并使错误消息更易于阅读。如果打开GHC中的所有警告(使用
-Wall
标志),它将警告您没有类型签名的顶级名称。

您的
curry
功能正常。你得到了什么错误?同意,这应该可以。好的,我发现我的测试函数max1是错误的
max1x y=curry max x y
工作。我是Haskell的新手,LoLBy eta reduction
max1 x y=curry max x y
max1=curry max
在这种情况下应该是等效的,但是Haskell中允许
max1=curry max
吗?您的
curry
函数可以工作。你得到了什么错误?同意,这应该可以。好的,我发现我的测试函数max1是错误的
max1 x y=curry max x y
有效。我是Haskell的新手,LoLBy eta reduction
max1 x y=curry max x y
max1=curry max
在这种情况下应该是等效的,但是Haskell允许
max1=curry max
吗?有趣的是,不知道GHCi中的类型推断与模块索引的顶级、
-Wall
(或至少是其中的一个子集)的工作方式不同默认情况下应该是打开的,IMHO。@NiklasB.:从一个相当新的版本(7.6或7.8或其他版本),
ghci
默认关闭了单态限制。谢谢!ghci pops错误与类型推断有关,我猜,但我不太明白为什么会有错误。我的
ghci
是7.8.3版,但它仍然报告了错误有趣的,不知道类型推断在ghci中的工作方式与模块索引的顶层不同,
-Wall
(或至少是其中的一个子集)默认情况下应该是打开的,IMHO。@NiklasB.:从一个相当新的版本(7.6或7.8或其他版本),
ghci
默认关闭了单态限制。谢谢!ghci pops错误与类型推断有关,我想,但我不太明白为什么会有错误。我的
ghci
是7.8.3版,但它仍然报告了错误