1

誰か理由を説明してくれませんか

Prelude> let a = 1
Prelude> :type a
a :: Integer
Prelude> :type 1
1 :: Num a => a

なぜ a は でありInteger1は なのNumですか? 理由1+2は理解できますNum。しかし、なぜ1ですか?

前もって感謝します。

4

2 に答える 2

13

これは、対話型プロンプトで型推論がどのように機能するかの成果物にすぎません。すべての数値リテラルは、型クラスaのインスタンスであるすべてに対してポリモーフィックですNumが、GHCi プロンプトではlet、明示的な署名のないバインディングはモノモーフィック型で推論されます (詳細はこちら)。

を設定することで、より一般的な型を GHCi に推論させることができます。

Prelude> :set -XNoMonomorphismRestriction 
Prelude> let a = 1
Prelude> :type a
a :: Num a => a
于 2013-11-12T10:53:45.557 に答える
5

これ1は単なる一般的なNum例であり、特定の例ではなく、完全に合理的であり、Haskell の型クラスの優れた点の 1 つです。これにより、実際の整数から複素数、無限次元のヒルベルト空間演算子まで、あらゆるコンテキストで整数リテラルを使用できるようになり、変換や7.0、他の言語でよく見られるひどく醜い " " (またはさらに悪い) リテラルを気にする必要がなくなります。

より良い質問は次のとおりです:なぜaもそのような一般的なインスタンスではなく、具象Integerなのですか? これは恐ろしい単型性制限と関係があります。shang で示されているように、これをオフにすることができます。しかし GHCi では、コンパイラに固定の選択をさせると実際には便利な場合があります。通常は型シグネチャをわざわざ書きたくないからです。

Haskell のソース ファイルでは、モノモーフィズムの制限は基本的にただのアーティファクトです。

于 2013-11-12T10:57:08.353 に答える