"Could not deduce" 多参数类型错误 class
"Could not deduce" error on multi-parameter type class
我有这个代码:
{-# LANGUAGE MultiParamTypeClasses #-}
import System.Random (RandomGen(..))
class RandomGen gen => Shadow gen light where
shadowRay :: gen -> light -> Float
eval :: light -> Float
我得到了那个错误:
[1 of 1] Compiling Main ( problem.hs, problem.o )
problem.hs:6:5: error:
* Could not deduce (Shadow gen0 light)
from the context: Shadow gen light
bound by the type signature for:
eval :: Shadow gen light => light -> float -> float
at problem.hs:6:5-40
The type variable `gen0' is ambiguous
* In the ambiguity check for `eval'
To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
When checking the class method:
eval :: forall gen light.
Shadow gen light =>
forall float. light -> float -> float
In the class declaration for `Shadow'
这是 GHC 7.10+ 的问题。在它工作之前。如果我将 "gen" 参数添加到 "eval",则有一个修复,例如:
eval :: gen -> light -> Float
但我不想添加一个不会被使用的新值参数。是否有其他类型解析方法?
问题是 eval
不使用 gen
,因此在选择 Shadow
实例时对其类型进行特化不足以决定使用哪个 gen
使用。一种可能的解决方案是使用 functional dependency 强制每个 light
:
的选择只有一个 gen
{-# LANGUAGE FunctionalDependencies #-}
class RandomGen gen => Shadow gen light | light -> gen where
shadowRay :: gen -> light -> Float
eval :: light -> Float
但是,您可能不想或不需要以这种方式耦合 light
和 gen
。在这种情况下,您可能需要考虑从类型 class 中删除 gen
的相反替代方案——如果 gen
和 light
不相关,则您不需要需要多参数类型 class 来关联它们:
class Shadow light where
shadowRay :: RandomGen gen => gen -> light -> Float
eval :: light -> Float
我有这个代码:
{-# LANGUAGE MultiParamTypeClasses #-}
import System.Random (RandomGen(..))
class RandomGen gen => Shadow gen light where
shadowRay :: gen -> light -> Float
eval :: light -> Float
我得到了那个错误:
[1 of 1] Compiling Main ( problem.hs, problem.o ) problem.hs:6:5: error: * Could not deduce (Shadow gen0 light) from the context: Shadow gen light bound by the type signature for: eval :: Shadow gen light => light -> float -> float at problem.hs:6:5-40 The type variable `gen0' is ambiguous * In the ambiguity check for `eval' To defer the ambiguity check to use sites, enable AllowAmbiguousTypes When checking the class method: eval :: forall gen light. Shadow gen light => forall float. light -> float -> float In the class declaration for `Shadow'
这是 GHC 7.10+ 的问题。在它工作之前。如果我将 "gen" 参数添加到 "eval",则有一个修复,例如:
eval :: gen -> light -> Float
但我不想添加一个不会被使用的新值参数。是否有其他类型解析方法?
问题是 eval
不使用 gen
,因此在选择 Shadow
实例时对其类型进行特化不足以决定使用哪个 gen
使用。一种可能的解决方案是使用 functional dependency 强制每个 light
:
gen
{-# LANGUAGE FunctionalDependencies #-}
class RandomGen gen => Shadow gen light | light -> gen where
shadowRay :: gen -> light -> Float
eval :: light -> Float
但是,您可能不想或不需要以这种方式耦合 light
和 gen
。在这种情况下,您可能需要考虑从类型 class 中删除 gen
的相反替代方案——如果 gen
和 light
不相关,则您不需要需要多参数类型 class 来关联它们:
class Shadow light where
shadowRay :: RandomGen gen => gen -> light -> Float
eval :: light -> Float