问题是我需要输入一个十进制数字,如一个浮点数,格式正确。 但是,我不知道如何解析输入以确保它真的是浮动的。如果没有,我需要把#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
答案 0 :(得分:6)
read
是partial 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
在无法解析字符串时抛出异常。你需要处理那个例外。