我有这样的代码:
{-# 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
但是我不想添加一个新的值参数,它不会被使用。是否有其他的方式来分辨类型?
发布于 2017-01-11 15:58:30
问题是eval不使用gen,因此专门化它的类型不足以决定在选择要使用的Shadow实例时使用哪个gen。一种可能的解决方案是使用功能依赖强制每个选择的light只有一个gen。
{-# LANGUAGE FunctionalDependencies #-}
class RandomGen gen => Shadow gen light | light -> gen where
shadowRay :: gen -> light -> Float
eval :: light -> Float但是,您可能不希望或不需要以这种方式将light和gen结合起来。在这种情况下,您可能需要考虑从类型类中删除gen的相反选择--如果gen和light不相关,则不需要多参数类型类来关联它们:
class Shadow light where
shadowRay :: RandomGen gen => gen -> light -> Float
eval :: light -> Floathttps://stackoverflow.com/questions/41592832
复制相似问题