2

Haskell の初心者は、最初の 3 つは問題なかったのに、4 番目のステートメントが失敗した理由を知りたがっています。

Prelude> read "5.3" + 5.0                   -- ok
10.3

Prelude> read "5"   + 5                     -- ok
10

Prelude> read "5"   + 5.3                   -- ok
10.3

Prelude> read "5.3" + 5                     -- huh ???
*** Exception: Prelude.read: no parse

:t 5.3 は Fractional であるのに対し、5 は単なる Num であることがわかりますが、最初の 3 つのコマンドが機能したため、どちらも read から返される必要があり、(+) は Nums の任意のペアで機能するはずです。何が起きてる ?

4

1 に答える 1

9

数値式の型があいまいな場合、Haskell は最初に に解決しようとしInteger、それDoubleが機能しない場合は (浮動小数点数) に解決しようとします。これは、単純な算術式の型を明示的に指定しなければならないのはかなり面倒だからです。

この特定の例5.3は、Integer(でIntegerはないFractionalため)ではないために発生したため、その場合は に解決されDoubleました。しかし、5は である可能性がありIntegerread "5.3"読み取り可能な任意の型である可能性があるため、有効なリテラルではないIntegerため、デフォルトで になり、実行時に爆発しました。5.3Integer

をオンにすると-Wall、このタイプのデフォルトが発生することがわかります。その場合、警告が表示されます。(ただし、このようなデフォルト設定はGHCiでは非常に一般的であるため、これは通常、実際には非常に厄介です。)

于 2012-04-14T22:50:25.553 に答える