誰か理由を説明してくれませんか
Prelude> let a = 1
Prelude> :type a
a :: Integer
Prelude> :type 1
1 :: Num a => a
なぜ a は でありInteger
、1
は なのNum
ですか? 理由1+2
は理解できますNum
。しかし、なぜ1
ですか?
前もって感謝します。
これは、対話型プロンプトで型推論がどのように機能するかの成果物にすぎません。すべての数値リテラルは、型クラスa
のインスタンスであるすべてに対してポリモーフィックですNum
が、GHCi プロンプトではlet
、明示的な署名のないバインディングはモノモーフィック型で推論されます (詳細はこちら)。
を設定することで、より一般的な型を GHCi に推論させることができます。
Prelude> :set -XNoMonomorphismRestriction
Prelude> let a = 1
Prelude> :type a
a :: Num a => a
これ1
は単なる一般的なNum
例であり、特定の例ではなく、完全に合理的であり、Haskell の型クラスの優れた点の 1 つです。これにより、実際の整数から複素数、無限次元のヒルベルト空間演算子まで、あらゆるコンテキストで整数リテラルを使用できるようになり、変換や7.0
、他の言語でよく見られるひどく醜い " " (またはさらに悪い) リテラルを気にする必要がなくなります。
より良い質問は次のとおりです:なぜa
もそのような一般的なインスタンスではなく、具象Integer
型なのですか? これは恐ろしい単型性制限と関係があります。shang で示されているように、これをオフにすることができます。しかし GHCi では、コンパイラに固定の選択をさせると実際には便利な場合があります。通常は型シグネチャをわざわざ書きたくないからです。
Haskell のソース ファイルでは、モノモーフィズムの制限は基本的にただのアーティファクトです。