如何解析Haskell中的浮点数输入?

时间:2014-11-25 08:10:01

标签: haskell

问题是我需要输入一个十进制数字,如一个浮点数,格式正确。 但是,我不知道如何解析输入以确保它真的是浮动的。如果没有,我需要把#StrLn" ERR"。假设我有连续的输入。

如下所示,我可以在IF之后添加什么条件来排除错误的输入格式,例如1.2.e!@# $,我应该给出一个" ERR"并循环主要而不是立即获得错误并退出程序。

input <- getLine
if (read input1 :: Float) > 1.0
    then do 
        let result1 = upperbound (read input :: Float)
        let result2 = lowerbound (read input :: Float)
        print result4
        print result3
        main
    else do 
        putStrLn"ERR"
        main

2 个答案:

答案 0 :(得分:6)

readpartial function - 它仅适用于输入域的子集。部分函数的一个更好的例子是head:它在非空列表上运行良好,但会在空列表上抛出错误 - 并且只能在IO monad中处理错误。部分函数在某些情况下很有用,但通常应避免使用它们。所以像head一样,read是一个不安全的函数 - 当无法解析输入时它可能会失败。

read有一个安全的选择:来自readMaybe的{​​{1}}。

Text.Read

readMaybe :: Read a => String -> Maybe a 永远不会失败 - 如果它无法解析字符串,它将返回readMaybe。处理Nothing值是一项简单的任务,可以通过多种方式完成(Maybe表达式,case函数,Data.Maybe表示法等等。以下是使用do表达式的示例:

case

This article有助于理解Haskell中错误处理的不同方式。

答案 1 :(得分:0)

Prelude> let s1 = "1.223"
Prelude> let s2 = "1"
Prelude> let s3 = "1.2.e!@#$"
Prelude> read s1 :: Float
1.223
Prelude> read s2 :: Float
1.0
Prelude> read s3 :: Float
*** Exception: Prelude.read: no parse

read在无法解析字符串时抛出异常。你需要处理那个例外。