Haskell 哈斯克尔咖喱
我在Haskell中手动编写了一个currying函数,如下所示。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选择一个特定的可订购类型。由于没
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 reductionmax1 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 reductionmax1 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版,但它仍然报告了错误