2016-11-13 17 views
1

IntまたはIntegerのような特定のタイプにデフォルト設定するのではなく、一般タイプNum a => a2に割り当てる背後にある根拠は何ですか?haskellで2のタイプの好奇心ケース

私は多くの場所で2が多形性値であることを読んだが、多型性の定義は制約付き変数を認めていない。ハスケルでは2多型ですか?

+0

ダウンリストへ:この質問はあなたの好みにどういうものなのか説明してください。私はこれが面白くて明白ではない質問だと思います。質問が何らかの形でうまく行かないと思ったらコメントしてください。 – Alec

+0

'2'は'(+) 'や'(*) 'と全く同じような関数です。なぜ '(*)'にその型があるのですか? '2'も同じ理由を使用します。 '(+)'は多態性ですか? '2'もそうです。 –

+0

https://wiki.haskell.org/Polymorphism –

答えて

4

2は多型ですので、好きな番号のタイプとして使用できます。 Numタイプのクラスには、関数fromIntegerがあり、ここで使用されます。だから2は実際にはfromInteger (2 :: Integer)です。 2が多型でない場合は、Haskellに自動強制がないため(つまり、(1 :: Integer) + (1 :: Int)は実行できません)、整数でない数値が必要な場合は、常にこれを記述する必要があります。途中でFractionalの場合はfromRationalとなります。

多型変数には制約があります。彼らは制約を持っていない場合、それはパラメトリック多型と呼ばれ、彼らがしなければは、制約囲まれたパラメトリックまたはアドホック多型HaskellWiki article on polymorphismも参照してください。

トップレベル関数の型推論に頼ってはいけません。それ以外の場合は、monomorphism restrictionにトラップする可能性があります。あなたがタイプNum a => aであるとpolymorphicを期待することがあり

polymorphic = 42 

が、実際にはHaskellはIntegerpolymorphicのタイプをデフォルトとします。たとえば、あなたはモジュールのトップレベルでこれを書いている場合。

+0

明示的に '2'の型を指定せず、型推論で' 2'定数に具体的な型を指定しないと、いくつかの単形化が行われるということも付け加えます:https://wiki.haskell.org/Monomorphism_restriction – Shersh

+0

私はHaskell wikiが正しいとは確信していません。 Typeclssは、_ad hocポリモーフィズム_とは若干異なる_boundedパラメトリックポリモーフィズム_を導入しています。しかし、私はここで少しペタントなかもしれません。 – Nicolas

+0

@Nicolas AFAICT彼らは違いはありません。 –

関連する問題