首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Haskell函数的自由版本会导致类型错误?

为什么Haskell函数的自由版本会导致类型错误?
EN

Stack Overflow用户
提问于 2015-05-12 04:12:07
回答 1查看 869关注 0票数 12

结果表明,在GHC 7.10中,这编译得很好:

代码语言:javascript
运行
复制
mysum xs = foldr (+) 0 xs

但这一点:

代码语言:javascript
运行
复制
mysum    = foldr (+) 0

结果出现以下错误:

代码语言:javascript
运行
复制
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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-12 05:03:51

与往常一样,在这样的情况下,使一个类型良好的函数点自由突然导致类型错误关于未满足的类型限制,最终的原因是单态约束,默认情况下启用。

您可以通过向mysum添加类型签名来解决这一问题。

代码语言:javascript
运行
复制
mysum :: (Foldable f, Num a) => f a -> a

或者通过关闭单态限制:

代码语言:javascript
运行
复制
{-# LANGUAGE NoMonomorphismRestriction #-}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30181658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档