私はこの実装を使用しています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 の型システムは、完全な動的型付けなしでは実際には不可能なときに、これを行うことができるはずだと私を騙しているだけですか? もしそうなら、なぜ私のコードはコンパイルされるのですか?なぜ整数を想定するのですか?