Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing Haskell:读取数字(整数或浮点)_Parsing_Haskell_Input_Io_Typing - Fatal编程技术网

Parsing Haskell:读取数字(整数或浮点)

Parsing Haskell:读取数字(整数或浮点),parsing,haskell,input,io,typing,Parsing,Haskell,Input,Io,Typing,我使用的是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 =

我使用的是
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
getNum::(Num a,Read a)=>String->IO a
getnums=do
putstrs

输入您的函数将确实接受
Integer
Float
,或任何其他
Num
实例。但是,它接受哪种类型,以及它如何解析
字符串
,并不是由它接收的输入决定的,而是由结果应该基于您对它所做的操作的类型决定的

假设您使用
getNum
,并将结果值传递给需要
浮点值的对象;在这种情况下,它将解析一个
Float
值。如果您将它传递给需要一个
整数的对象,它将解析它


至于为什么它假定
Integer
,对于不明确的类型有一个“默认”系统,规则说带有
Num
约束的不明确类型应该默认为
Integer

,好的,所以我想在我的示例中我必须添加
::(分数a,读a)=>IO a
当我调用
getNum
来允许小数时(我不想显式地指定float或double)。是的,但是请注意,添加
fractive
约束将限制它只接受
fractive
的实例,因此您无法以这种方式将其用于其他类型。在实际的程序中,大多数时候你会知道你需要的特定类型,因此通常没有理由约束某些东西,除了GHCi中的测试之类的东西。我没有将它添加到实际的函数中,而是在使用函数时将其添加为类型注释。我不太确定我是否理解你在最后一句话中所说的,类型类约束在Haskell代码中是否普遍存在,用于泛化函数?啊。对不起,我看错了。总之,我想说的是,实际上很少需要添加额外的约束或显式类型注释,因为最终您会将
getNum
的输出传递给需要特定类型的对象,然后类型推理将从那里处理它。我已将其更改为默认值,并且我也只是使用
default(Double)
而不是长类型注释,因为这是一个非常小的模块,我认为这样更符合逻辑。小风格说明:使用模式匹配比使用
isNothing
fromJust
更好,因此
if
表达式可以替换为
case input of Nothing->getNum s;只需x->返回x
。谢谢,看起来好多了。