2013-07-24 5 views
6

Haskell's type-defaulting rulesデフォルト変数タイプ制約(C1のA、...、CN A)場合:一般型不履行ルール

  • 変数はない他の制約に表示タイプ
  • すべてのクラスCiが標準です。
  • CIクラスの少なくとも一つは、数値

ですこれは私には理にかなっているが、それはまた、非常に限られます:実際に、それはあなたが常にあなたが作業しているとき、それは曖昧であるとき、型を指定しなければならないことを意味しますカスタムクラスを使用します。例えば、これはコンパイルされない:

class (Show a) => MyShow a where 
    myShow :: a -> String 
    myShow = show 

instance (MyShow a) => MyShow (Maybe a) where 
    myShow Nothing = "Nothing" 
    myShow (Just x) = "Just " ++ (myShow x) 

main = print $ myShow Nothing -- ambiguous 

GHCiのは、このように規則のセットを拡張:

  • クラスCIの全ては、単一のパラメータ型クラスです。 CIクラスの
  • 少なくとも一つは、数値である、またはショー、またはオードです。

となり、GHCには、これらのルールを有効にするExtendedDefaultRulesという拡張子があります。しかし、この拡張は非常に具体的です.GHCと標準クラスでのみ機能します。たとえば、標準ライブラリを使用しないライブラリについて考えることができます。その場合、GHCi拡張は機能しません。

私の質問は:GHCiのようなHaskellの型デフォルトのルールを拡張する唯一の方法は、コンパイラの拡張機能ですか?そしてもっと一般的です:Haskell 98の制約に関するいくつかのルールに基づいて型のデフォルトを定義する方法はありますか?

+3

あなたが望むことをする方法はありません。あなたが良いデザインを考え出すことができれば、私たちはすべて耳です。現在のタイプのデフォルト設定はいぼです。以下のような – augustss

+1

何か: 'インスタンス(MyShow A)=> MyShow(たぶん)(INT)不履行 .... ' 。コンパイラは、型が曖昧で、その場合はデフォルトであるかどうかを調べることができます。上記の場合、Nothingには、おそらくInt型があります。もちろん、制約を満たす型に対してのみデフォルトを設定できます。 – mariop

+1

@mariop私はあなたがこのアイデアに興奮していることを理解していますが、現時点では少しハーフベークしたようです。考えるべきことはたくさんあります。すべてのデフォルトが違う制約が多い場合はどうしたらいいですか?図書館利用者は、図書館のニーズに近づけるために、図書館のデフォルト設定にどのように影響を与えることができますデフォルトの指示を付けるために、インスタンスが正規の正しい場所となるのはなぜですか?あなたのソリューションは、マルチパラメータ型のクラス(および基底関数、タイプファミリ)に一般化できますか?私は、完全な提案が取り組む必要がある他の多くの難しい質問もあると確信しています。 –

答えて

6

あなたが望むことをする方法はありません。

現在の状況は設計によって犠牲になっています。アイデアは、我々が良いデザインを持っているときに将来拡張される可能性のあるものを最小限にすることでした。