无法推断(TypeClass a0)因使用'变量'而产生

时间:2017-01-04 10:59:51

标签: haskell typeclass higher-rank-types

我有一个类型:

type DifferentiableFunction n a = (Function n a, List n (Function n a), String)

在其他地方我定义:

data Something where
  Operator :: Something -> (forall a . Floating a => DifferentiableFunction n a) -> Something

现在我尝试模式匹配:

case something of
  (Operator s f) -> let (_, _, l) = f in l

我得到Could not deduce (Floating a0) arising from a use of ‘f’。我不明白为什么会这样。

1 个答案:

答案 0 :(得分:2)

问题在于let (_, _. l) = f in l未指定f使用的类型:它可能是DifferentiableFunction n DoubleDifferentiableFunction n Float或其他类似内容。因为您只使用不依赖a的部分(l只是String,无论a是什么),编译器无法确定哪种类型f应该有{a是不明确的,即编译不知道为a选择什么。

因此,解决方案是为f:

提供显式类型签名
case something of
  (Operator s f) -> let (_, _, l) = (f :: DifferentiableFunction n Double) in l

或者,将String抬出forall:

type DifferentiableFunction n a = (Function n a, List n (Function n a))
data Something where
  Operator :: Something -> (forall a . Floating a => DifferentiableFunction n a) -> String -> Something -- String is not inside the `forall a.`

现在您可以获取String而无需选择特定的a,因为它确实独立于a