Haskell 有没有可能';未经批准的';所有量词?
假设我们有一个类型构造函数f,它通过一个DataTypes提升对接受两种类型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).
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)