假设我们有一个类型构造函数 f,它通过一个 DataKinds-promoted 对来接受两种类型。
forall (f :: (ka, kb) -> *)
然后我可以实现一个函数,forward
就像量词一样:curry
forall
forward :: forall (f :: (ka, kb) -> *).
(forall (ab :: (ka, kb)). f ab) ->
(forall (a :: ka) (b :: kb). f '(a, b))
forward x = x
但是,反向功能是有问题的:
backward :: forall (f :: (*, *) -> *).
(forall (a :: *) (b :: *). f '(a, b)) ->
(forall (ab :: (*, *)). f ab)
backward x = x
GHC 8.0.1 给出错误消息:
• 无法将类型 'ab' 与 ''(a0, b0)' 匹配 'ab' 是一个刚性类型变量,由 类型签名: 向后 :: forall (ab :: (*, *))。(forall a b. f '(a, b)) -> f ab 在:6:116 预期类型:f ab 实际类型:f '(a0, b0) • 在表达式中:x 在“向后”的方程中:向后 x = x
从概念上讲,它似乎是一个有效的程序。有没有另一种方法来实现这个功能?或者这是 GHC 的已知限制?