2

Haskell で、関数矢印型コンストラクター (->) をその右側の型 (たとえば (-> a)) のみに適用して、種類 * -> * の型コンストラクターを取得することは可能ですか?

4

1 に答える 1

3

いいえ、現時点では不可能です。Haskell の型システムには特定の制限があり、ほとんどの場合に便利で便利です。これはその制限の 1 つです。最良の代替手段は、newtype を使用することです。

newtype FuncFlip r a = FuncFlip { unFuncFlip :: a -> r }

newtype は、コンパイラが型チェックの方法を認識し、型指示ディスパッチ (型クラス) を適切に実行するのに役立つ単なるタグです。おそらく、型引数を反転して、型クラスのインスタンスを提供したいと考えていました。つまり、その型クラスの関数を利用したいときはいつでも、特定の入力をFuncFlipで装飾し、特定の出力を で装飾解除する必要がありますunFuncFlip。これは必要以上に少し冗長ですが、実際にはそれほど悪くはありません。使用する型クラスのインスタンスを明示的に識別する必要があるからです。

このためのNewtypeのインスタンスを作成できますが、これが便利な場合とそうでない場合があります。

instance Newtype (FuncFlip r a) (a -> r) where
  pack = FuncFlip
  unpack = unFuncFlip

さらに読む: 「型レベルのコンビナートはありますか?」

于 2012-05-23T20:19:13.580 に答える