我有一个类型:
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’
。我不明白为什么会这样。
答案 0 :(得分:2)
问题在于let (_, _. l) = f in l
未指定f
使用的类型:它可能是DifferentiableFunction n Double
或DifferentiableFunction 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
。