2016-07-19 10 views
3

は、私はすべてが同様のパターンに合うカップル型の別名を持っています。Polykinded型の組成物

type Foo = Bar `Compose1` Qoox 
type Faa = Bar `Compose1` Qaax 
type Moo = Fez `Compose2` Rxoo 
type Maa = Fez `Compose2` Rxaa 
-- ... 

をしかし、私は基本タイプが異なる種類であるため、複数Composeタイプを定義する必要がキープ:newtypesを定義するのではなく、私はタイプレベル合成を行うことができれば、それはきちんとしただろうと思いました。私が好きな何

は、だから私はちょうど

type Foo = Bar . Qoox 
type Faa = Bar . Qaax 
type Moo = Fez . Rxoo 
type Maa = Fez . Rxaa 
-- ... 

を行うことができます。しかし、私は「それはHaskellの現在の能力を超えてかもしれない、と私はドン疑う

type family (.) (m :: k1 -> k) (n :: k2 -> k1) :: k2 -> k where 

polykindedタイプレベルの関数であります不可能なものを実装しようとする時間を無駄にしたくない。

GHC8で利用可能な拡張機能を使用して、このような構成をHaskellで行うことはできますか?

答えて

5

私は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 

ただし、これは部分的には適用できないことに注意してください。また、定義を拡張する必要があります。

など。 type T = C [] []は使用できませんが、type T a = C [] [] aを使用できます。

η拡張がなければ、タイプコンストラクタでない限り、タイプk2 -> kを返すことはできません。タイプレベルのラムダ(または部分的なアプリケーション)はありません。

関連する問題