首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多参数类型类的“无法推断”错误

多参数类型类的“无法推断”错误
EN

Stack Overflow用户
提问于 2017-01-11 13:57:14
回答 1查看 239关注 0票数 1

我有这样的代码:

代码语言:javascript
复制
{-# LANGUAGE MultiParamTypeClasses #-}
import System.Random (RandomGen(..))

class RandomGen gen => Shadow gen light where
    shadowRay :: gen -> light -> Float
    eval      :: light -> Float

我明白了这个错误:

1编译Main ( problem.hs,problem.o ) problem.hs:6:5: problem.hs:6:5:*无法从上下文中推断(阴影gen0光):阴影成因光由类型签名绑定: eval ::影子简光=> light -> ->浮动在问题. To :6:5-40类型变量gen0' is ambiguous \* In the ambiguity check foreval‘以推迟对使用站点的模糊检查,在检查类方法时启用AllowAmbiguousTypes : eval ::forall。阴影世代光=>为所有浮子。轻型->浮动->浮动在“阴影”类声明中

这是来自GHC 7.10+的问题。在它开始工作之前。如果我将"gen“参数添加到"eval”中,就会有一个修正,例如:

eval :: gen -> light -> Float

但是我不想添加一个新的值参数,它不会被使用。是否有其他的方式来分辨类型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-11 15:58:30

问题是eval不使用gen,因此专门化它的类型不足以决定在选择要使用的Shadow实例时使用哪个gen。一种可能的解决方案是使用功能依赖强制每个选择的light只有一个gen

代码语言:javascript
复制
{-# LANGUAGE FunctionalDependencies #-}

class RandomGen gen => Shadow gen light | light -> gen where
    shadowRay :: gen -> light -> Float
    eval      :: light -> Float

但是,您可能不希望或不需要以这种方式将lightgen结合起来。在这种情况下,您可能需要考虑从类型类中删除gen的相反选择--如果genlight不相关,则不需要多参数类型类来关联它们:

代码语言:javascript
复制
class Shadow light where
    shadowRay :: RandomGen gen => gen -> light -> Float
    eval      :: light -> Float
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41592832

复制
相关文章

相似问题

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