【发布时间】:2020-12-04 23:10:37
【问题描述】:
我正在尝试使用类型族来生成依赖于某些类型级别自然的约束 数字。 这是这样一个函数:
type family F (n :: Nat) (m :: Nat) :: Constraint where
F 0 m = ()
F n m = (m ~ 0)
然后我有一个有这个约束的函数。
f :: forall n m. (KnownNat n, KnownNat m, m ~ 0) => ()
f = ()
当我尝试在我的类型系列的模式匹配中使用此功能时 应该产生这个约束,ghc说它不能推导出这个约束
这是一个例子:
g :: forall n m. (KnownNat n, KnownNat m, F n m) => ()
g =
case (natVal (Proxy @n)) of
0 -> ()
n -> f @n @m
它会产生错误
• Could not deduce: m ~ 0 arising from a use of ‘f’
from the context: (KnownNat n, KnownNat m, F n m)
bound by the type signature for:
g :: forall (n :: Nat) (m :: Nat).
(KnownNat n, KnownNat m, F n m) =>
()
‘m’ is a rigid type variable bound by
the type signature for:
g :: forall (n :: Nat) (m :: Nat).
(KnownNat n, KnownNat m, F n m) =>
()
• In the expression: f @n @m
In a case alternative: n -> f @n @m
In the expression:
case (natVal (Proxy @n)) of
0 -> ()
n -> f @n @m
|
168 | n -> f @n @m
| ^^^^^^^
【问题讨论】:
-
我也在努力解决约束问题。我认为您可能需要考虑 GADT 如何影响您的解决方案,因为它们允许您对数据类型的构造函数施加约束。实际上,您可以对每个构造函数设置不同的约束。
标签: haskell