Haskell 多类化合物

Haskell 多类化合物,haskell,Haskell,我有两个类型别名,它们都符合类似的模式: type Foo f = Bar (Qoox f) type Faa f = Bar (Qaax f) type Moo f = Fez (Rxoo f) type Maa f = Fez (Rxaa f) -- ... 我想让别名自由指向,这样我就可以自己使用它们了。我没有定义新类型,而是认为如果我能做类型级的组合,那就太好了: type Foo = Bar `Compose1` Qoox type Faa = Bar `Compose1` Qaax

我有两个类型别名,它们都符合类似的模式:

type Foo f = Bar (Qoox f)
type Faa f = Bar (Qaax f)
type Moo f = Fez (Rxoo f)
type Maa f = Fez (Rxaa f)
-- ...
我想让别名自由指向,这样我就可以自己使用它们了。我没有定义新类型,而是认为如果我能做类型级的组合,那就太好了:

type Foo = Bar `Compose1` Qoox
type Faa = Bar `Compose1` Qaax
type Moo = Fez `Compose2` Rxoo
type Maa = Fez `Compose2` Rxaa
-- ...
但是我不得不定义多个
Compose
类型,因为基本类型是不同的类型

我想要的是一个多类类型的级别函数

type family (.) (m :: k1 -> k) (n :: k2 -> k1) :: k2 -> k where
这样我就可以做了

type Foo = Bar . Qoox
type Faa = Bar . Qaax
type Moo = Fez . Rxoo
type Maa = Fez . Rxaa
-- ...
但我怀疑这可能超出了Haskell目前的能力,我不想浪费时间去实现不可能的事情


使用GHC8中提供的扩展,可以在Haskell中完成这样的合成吗?

我认为GHC目前无法使这些点成为自由的

GHCi 8.0似乎接受了这一点

> :set -XPolyKinds
> type C (m :: k1 -> k) (n :: k2 -> k1) (t :: k2) = m (n t)
> :i C
type C (m :: k1 -> k) (n :: k2 -> k1) (t :: k2) = m (n t) :: k
但是,请注意,这通常不能部分应用,并且需要您扩展定义

例如,我们不能使用
类型t=C[][]
,但我们可以使用
类型ta=C[][]]a

如果没有eta扩展,我认为我们不能返回一种类型
k2->k
,除非它是一个类型构造函数。我们没有类型级别的lambda(或部分应用程序)