【问题标题】:Why does Haskell point free version of function result in ambiguous type error?为什么 Haskell 无点函数版本会导致模棱两可的类型错误?
【发布时间】:2015-07-22 18:47:44
【问题描述】:

事实证明,在 GHC 7.10 中,这编译得很好:

mysum xs = foldr (+) 0 xs

但是这个:

mysum    = foldr (+) 0

导致以下错误:

No instance for (Foldable t0) arising from a use of ‘foldr’
The type variable ‘t0’ is ambiguous
Relevant bindings include
  mysum :: t0 Integer -> Integer (bound at src/Main.hs:37:1)
Note: there are several potential instances:
  instance Foldable (Either a) -- Defined in ‘Data.Foldable’
  instance Foldable Data.Functor.Identity.Identity
    -- Defined in ‘Data.Functor.Identity’
  instance Foldable Data.Proxy.Proxy -- Defined in ‘Data.Foldable’
  ...plus five others
In the expression: foldr (+) 0
In an equation for ‘mysum’: mysum = foldr (+) 0

为什么会发生这种情况?通过了解这种差异可以获得什么洞察力?另外,我可以给这个函数一个类型(仍然是通用的)来消除这个错误吗?

【问题讨论】:

  • 可怕的单态性限制再次来袭!
  • 我想,最近的GHC默认关闭了单态限制?
  • @arrowdodger,你漏掉了一封信:在最近的 GHCi 中,单态限制默认是关闭的。

标签: function haskell types monomorphism-restriction


【解决方案1】:

通常情况下,使类型良好的函数无点突然导致关于未满足类型类约束的类型错误,最终原因是默认启用的monomorphism restriction

您可以通过向mysum 添加类型签名来解决此问题:

mysum :: (Foldable f, Num a) => f a -> a

或者通过关闭单态限制:

{-# LANGUAGE NoMonomorphismRestriction #-}

【讨论】:

  • 这里是一个相关情况的例子:stackoverflow.com/questions/6052670
  • 符号 ... 单态性限制。多么好的名字。
  • @Ana:这听起来比实际要可怕得多,而且会出现很多。毫不奇怪:这是任意且不自然的,因此除非您立即知道它,否则它会绊倒您。这就是为什么人们喜欢称它为可怕的单态限制:)。
  • 我在 GHCi(版本 8.4.4)中也看到了上述错误。 GHCi 现在默认启用单态限制了吗?
猜你喜欢
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 2018-06-01
  • 2018-03-02
  • 2020-10-25
相关资源
最近更新 更多