2016-09-30 7 views
5

たとえば、パラメータの1つが上位型(* -> *)である多型を使用しているとします。上位キンダ型変数を使用して導出する

アークンや安全でない言語拡張を使用せずにこのようなタイプのインスタンスを派生させる一般的な方法はありますか?

私はコンテキストを指定することができるように、私はStandaloneDerivingを有効にしようとした:

deriving instance Show (m Int) => Show (Tricky m) 

しかし、GHCは、制約は、インスタンスヘッドよりも小さいことを特徴としない文句、とUndecidableInstancesの方向に私を指します。

要約すると:

1.を私は単純に、このアドバイスと一緒に行く、またはより良い方法はありますでしょうか?

2.このプロセスを簡単にするための提案はありますか?

「より高級な」インスタンスを派生させようとするのはどういうわけか間違っていますか? (例えば。Vector[]Set)の代わりに、いくつかの具体的なタイプのインスタンスを導出する方が良いだろう

答えて

8

1.UndecidableInstances程度危険なものは何もありません。

Show (Tricky m)を定義する別の方法は、mforall a. Show a => Show (m a)を満たすようにすることです。これは

class Show1 f where 
    showsPrec1 :: Show a => Int -> f a -> ShowS 

even cleverer version of Show1ような型クラスによって捕捉される4.9をベースに追加されました。 aShow aインスタンスがない場合、m aを表示するために使用できるので、より一般的です。

2.これを実行するための適切なビットと部分が見つかりました。

3.いいえ、それは右の頭の抽象へVector[]、およびSetなどのさらに高kinded構造オーバーです。モナド変圧器は種類が(* -> *) -> (* -> *)で、ファンクタと同種の種類の抽象的な種類が(* -> *)で、ファンクタと同じ種類の型を生成します。 Trickyは種類が(* -> *) -> *であり、ファンクタと同じ種類のものを取り、通常のデータ型を生成します。私はこの種のデータ型を「モデル」と呼んでいます。なぜなら、それらのデータ型は、どのように組み立てられるかを抽象化したデータ型を生成するからです。

関連する問題