簡體   English   中英

Haskell:讀取一個數字(整數或浮點數)

[英]Haskell: read a number (Integer or Floating point)

我正在使用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它會將其視為錯誤輸入 - 為什么? 我的代碼中沒有出現IntInteger 我只使用Num ,因為我想接受任何類型的號碼。

如果我明確地將其稱為getNum "Enter a number: " :: IO Double ,那么它可以工作。 我必須這樣做嗎? Haskell的類型系統是不是讓我覺得我應該能夠在沒有完全動態類型的情況下實現這一點時能夠做到這一點? 如果是這樣,為什么我的代碼甚至編譯; 為什么它假設整數?

您的函數確實會接受IntegerFloat或任何其他Num實例。 但是,它接受哪種類型,並且通過擴展如何解析String ,它不是由它接收輸入決定的,它取決於你使用它做什么,結果應該是什么類型

假設你使用getNum並將結果值傳遞給需要Float東西; 在這種情況下,它將解析Float值。 如果將它傳遞給需要Integer東西,它將解析它。

至於為什么它假設為Integer ,對於Haskell報告中指定的模糊類型存在“默認”系統,並且規則說具有Num約束的模糊類型應該默認為Integer

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM