Haskell 像函数一样组合类型构造函数

Haskell 像函数一样组合类型构造函数,haskell,Haskell,我最近遇到了一种情况,我希望能够在实例声明中组合类型构造函数。我希望这样做: instance (SomeClass t, SomeClass t') => SomeClass (t . t') where 定义了(t.t'),使得(t.t')a=t(t'a)(所以t和t'有种类*->*。我们可以部分地应用类型构造函数,比如函数,那么我们不能组合它们的原因是什么呢?另外,对于我试图实现的东西,可能有解决方法吗?可能有等式约束 (我确实知道它的存在,但它只是创建了一个newtype包装器-

我最近遇到了一种情况,我希望能够在实例声明中组合类型构造函数。我希望这样做:

instance (SomeClass t, SomeClass t') => SomeClass (t . t') where
定义了
(t.t')
,使得
(t.t')a=t(t'a)
(所以
t
t'
有种类
*->*
。我们可以部分地应用类型构造函数,比如函数,那么我们不能组合它们的原因是什么呢?另外,对于我试图实现的东西,可能有解决方法吗?可能有等式约束

(我确实知道它的存在,但它只是创建了一个
newtype
包装器-我想要一个类型同义词)

(我知道存在
Control.Compose
,但它只是创建了一个
newtype
wrapper-我想要一个类型同义词)

这在Haskell中是不允许的。必须完全应用类型同义词:不能编写
composett'
,只能编写
composeta

允许部分应用类型同义词将导致类型级别的lambda,这使得类型推理不可判定,因此Haskell中缺乏对它的支持


例如,(启用所有相关GHC扩展)

结果:

 Type synonym ‘Compose’ should have 3 arguments, but has been given 2
    In the type signature for ‘pr’: pr :: Proxy (Compose [] [])
同样地

class C k where f :: k Int -> Int
instance C (Compose [] []) where f _ = 6
收益率:

Type synonym ‘Compose’ should have 3 arguments, but has been given 2
    In the instance declaration for ‘C (Compose [] [])’
下面是一个示例,其中允许使用类型同义词部分应用程序(启用
liberaltypeesynonyms
):


然而,请注意,这只起作用,因为在同义词扩展之后,我们得到了一个完全应用的类型
[]([]Int)
(即
[[Int]]
)。大致上,此功能不允许手动扩展同义词。尽管在某些情况下,
-XLiberalTypeSynonyms
允许部分应用类型同义词,但此功能不允许手动扩展同义词。不过,在这种情况下,答案很好。
类型级别的lambdas
正是int的类型我正在寻找的工具。类型推理是不可判定的,类型级别为lambada。
Type synonym ‘Compose’ should have 3 arguments, but has been given 2
    In the instance declaration for ‘C (Compose [] [])’
type T k = k Int
type S = T (Compose [] [])

bar :: S -> S
bar = map (map succ)