Haskell 有没有可能';未经批准的';所有量词?

Haskell 有没有可能';未经批准的';所有量词?,haskell,currying,type-level-computation,data-kinds,higher-rank-types,Haskell,Currying,Type Level Computation,Data Kinds,Higher Rank Types,假设我们有一个类型构造函数f,它通过一个DataTypes提升对接受两种类型 forall (f :: (ka, kb) -> *) 然后,我可以实现一个函数forward,它类似于curry,用于forall量词: forward :: forall (f :: (ka, kb) -> *). (forall (ab :: (ka, kb)). f ab) -> (forall (a :: ka) (b :: kb).

假设我们有一个类型构造函数f,它通过一个DataTypes提升对接受两种类型

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给出了错误消息:

• Couldn't match type ‘ab’ with ‘'(a0, b0)’ ‘ab’ is a rigid type variable bound by the type signature for: backward :: forall (ab :: (*, *)). (forall a b. f '(a, b)) -> f ab at :6:116 Expected type: f ab Actual type: f '(a0, b0) • In the expression: x In an equation for ‘backward’: backward x = x •无法将类型“ab”与“”(a0,b0)匹配 “ab”是一个刚性类型变量,由 以下项的类型签名: 向后::forall(ab::(*,*)。(对于所有a b.f'(a,b))->f ab 时间:6:116 预期类型:f ab 实际类型:f'(a0,b0) •在表达式中:x 在“向后”的方程式中:向后x=x
从概念上讲,它似乎是一个有效的程序。是否有其他方法实现此功能?或者这是GHC已知的局限性?

正如pigworker和Daniel Wagner指出的那样,问题在于,
ab
可能是“卡滞型”。有时可以使用类型族解决此问题(如我在中所了解的):

有时,另一种选择是使用包装器

newtype Curry f x y = Curry (f '(x,y))

data Uncurry f xy where
  Uncurry :: f x y -> f '(x, y)

当类型级别的“计算”不是目标时,不确定类型级别的计算是否是一个合适的标签。据我所知,GHC还不认为
ab~”(Fst ab,Snd ab)
,其中
Fst
Snd
是类型级别的预测。不确定,但猜测一下:又一次罢工了。(
Any::(*,*)
但是对于任何
a
b
来说,
Any~(a,b)
并不是这样的。请原谅我的无知,但是这些
向前
向后
功能的目的是什么?你想什么时候使用它们?它们在我看来就像是复杂的
id
函数。@AlexisKing:好吧,从逻辑上讲,任何真实的语句都是同义反复。。。不过说真的,如果需要将多个类型“填充”到一个函子中,我认为这非常有用。
newtype Curry f x y = Curry (f '(x,y))

data Uncurry f xy where
  Uncurry :: f x y -> f '(x, y)