7

私はこの実装を使用していますmaybeRead:

maybeRead :: (Read a) => String -> Maybe a
maybeRead = fmap fst . listToMaybe . filter (null . dropWhile isSpace . snd) . reads

getNum有効な入力を取得するまでプロンプトを表示する独自の関数:

getNum :: (Num a, Read a) => String -> IO a
getNum s = do
    putStr s
    input <- fmap maybeRead getLine
    if isNothing input
        then getNum s
        else return $ fromJust input

しかし、入力5.2すると不正な入力として扱われます — なぜですか? 私のコードにはIntとの出現はありません。あらゆる種類の番号を受け入れたいので、Integer私は のみを使用しています。Num

として明示的に呼び出すとgetNum "Enter a number: " :: IO Double、機能します。私はこれをしなければなりませんか?Haskell の型システムは、完全な動的型付けなしでは実際には不可能なときに、これを行うことができるはずだと私を騙しているだけですか? もしそうなら、なぜ私のコードはコンパイルされるのですか?なぜ整数を想定するのですか?

4

1 に答える 1

14

関数はInteger、 、Float、またはその他のNumインスタンスを実際に受け入れます。ただし、それが受け入れる型、および拡張により、 を解析する方法は、受信Stringした入力によって決定されるのではなく、結果がどのような型になるかによって決定されます。

を使用getNumして、結果の値を必要なものに渡すとしますFloat。その場合、Float値を解析します。代わりにを必要とするものに渡すとInteger、それが解析されます。

を仮定する理由については、Haskell Report で指定されたIntegerあいまいな型の「デフォルト」システムがあり、規則では、制約のあるあいまいな型はデフォルトで.NumInteger

于 2012-03-04T01:57:27.990 に答える