Haskell 封装类型的类型级统一和值级模式匹配

Haskell 封装类型的类型级统一和值级模式匹配,haskell,pattern-matching,unification,Haskell,Pattern Matching,Unification,我试图简化复合数据类型,但不知道最好的方法。以下是我目前的代码: data Init a b c d = Init a b c d data Wrap a = WNil (Init a b c d) | WCons a (Wrap a) 我一直看到的问题可能很明显-我无法将预期结果类型的类型变量与封装的类型变量统一起来: -- | Will fail to compile unWrap :: Wrap a -> Init a b c d unWrap (WNil

我试图简化复合数据类型,但不知道最好的方法。以下是我目前的代码:

data Init a b c d = Init a b c d

data Wrap a = WNil (Init a b c d)
            | WCons a (Wrap a)
我一直看到的问题可能很明显-我无法将预期结果类型的类型变量与封装的类型变量统一起来:

-- | Will fail to compile
unWrap :: Wrap a -> Init a b c d
unWrap (WNil x) = x
unWrap (WCons _ xs) = unWrap xs

我听说有人把
-xexistinationalquantification
作为一种可能的解决方案,但我什么都做不到。除了将类型参数浮动到
Wrap
之外,有人知道在这里要做什么吗?

不幸的是,您想要什么还不清楚。为什么将类型参数浮动到
Wrap
不是一个选项?如果
a
b
c
d
是真正独立和灵活的,那么这似乎是正确的做法。即使你使用存在量化,你也对隐藏类型一无所知,也不能对它们做任何有用的事情。@AthanClark一旦你把
Init
放在存在包装器中,你就完全不能对
bd
字段做任何事,这几乎把它们扔进了一个黑洞。存在主义只有在有额外的数据包装的情况下才有用,比如类实例、函数或单例。你不能扔掉
b、c、d
,然后取回它们。最多,您的
unWrap
函数只能暂时将它们重新包装到一个新的存在类型容器中,或者将它们传递给一个多模态计数,例如
unWrap::Wrap a->(对于所有bcd.Init a b c d->r)->r
。此外,我看不出问题的标题与实际问题的关系。标签也仅与标题一致。你能解释一下或者编辑一下,让它们更相关吗?我认为如果你把你试图解决的实际问题包括进来,这个问题的清晰性将真正受益。