gpt4 book ai didi

haskell - 从输入 Haskell 读取数字

转载 作者:行者123 更新时间:2023-12-02 16:39:25 24 4
gpt4 key购买 nike

我想要一个函数,它可以读取任意整数,直到插入数字“0”,然后将插入的数字呈现在有序列表中。

为此我编写了这个函数:

import Data.List

readIntegers :: IO()
readIntegers = do
putStrLn "insert a number: "
num<-getLine
let list = ordList ((read num :: Int):list)
if (read num == 0)
then print list
else readIntegers
where ordList ::[Int]->[Int]
ordList [] = []
ordList xs = sort xs

这编译得很好,但是当我插入数字“0”时,它给了我这个错误:

*** Exception: <<loop>>

我做错了什么?

最佳答案

正如 @phg 指出的,您本质上是在构造一个无限列表,并且实际评估它会导致循环错误。解决此问题的一个简单实现是定义一个辅助函数,它接受一个附加参数 - 一个用于存储从屏幕读取的所有输入的列表,如下所示:

readInteger :: IO ()
readInteger = readInteger' []
where
readInteger' x = do
putStrLn "insert a number: "
num<-getLine
if ((read num :: Int) == 0)
then print $ ordList x
else readInteger' $ (read num :: Int):x
where ordList ::[Int]->[Int]
ordList [] = []
ordList xs = sort xs

请注意,上面的内容本质上只是 @phg 答案的实现,但对您的原始逻辑进行了一些更改。首先,由于 0 是一个哨兵值,我们不应该将其附加到我们的列表中。其次,我们不需要每次向列表添加值时都对列表进行排序。在打印/传递到另一个函数时排序一次就足够了。

Demo

如果您想读取未指定数量的整数而不提示用户输入并在遇到 0 时将其切断,您可能最好使用 getContents,它将读取来自标准输入作为单个字符串,惰性地。

然后,将其解析为数字列表并用它做你想做的事情就很简单了,如下所示:

readIntegers :: ()
readIntegers = do
a <- getContents
let b = ordList $ takeWhile (/= 0) $ map (\x -> read x :: Int) $ words a
mapM (putStrLn . show) b
where ordList ::[Int]->[Int]
ordList [] = []
ordList xs = sort xs

关于haskell - 从输入 Haskell 读取数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28011292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com