Int
またはInteger
のような特定のタイプにデフォルト設定するのではなく、一般タイプNum a => a
を2
に割り当てる背後にある根拠は何ですか?haskellで2のタイプの好奇心ケース
私は多くの場所で2
が多形性値であることを読んだが、多型性の定義は制約付き変数を認めていない。ハスケルでは2
多型ですか?
Int
またはInteger
のような特定のタイプにデフォルト設定するのではなく、一般タイプNum a => a
を2
に割り当てる背後にある根拠は何ですか?haskellで2のタイプの好奇心ケース
私は多くの場所で2
が多形性値であることを読んだが、多型性の定義は制約付き変数を認めていない。ハスケルでは2
多型ですか?
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はInteger
へpolymorphic
のタイプをデフォルトとします。たとえば、あなたはモジュールのトップレベルでこれを書いている場合。
ダウンリストへ:この質問はあなたの好みにどういうものなのか説明してください。私はこれが面白くて明白ではない質問だと思います。質問が何らかの形でうまく行かないと思ったらコメントしてください。 – Alec
'2'は'(+) 'や'(*) 'と全く同じような関数です。なぜ '(*)'にその型があるのですか? '2'も同じ理由を使用します。 '(+)'は多態性ですか? '2'もそうです。 –
https://wiki.haskell.org/Polymorphism –