gpt4 book ai didi

loops - 使用 Haskell 读取 n 行输入

转载 作者:行者123 更新时间:2023-12-05 09:15:05 29 4
gpt4 key购买 nike

我正在尝试学习编写 Haskell 程序。我无法读取 n 行输入。

输入是

n
a b (<----- n times)

其中 nab 是数字。

我试过了

input = []

readString 0 = return()
readString n =
do
z <- getLine
z:input
readString (n-1)

main = do
n <- getLine
readString n

抛出错误。如何在 Haskell 中正确循环读取?

最佳答案

Haskell 是不可变的:一旦你编写

input = []

然后 input 永远是 [],阿门。您可以使用与 n 的“变化”值相同的技术来获得 input 的“变化”值,即将其作为参数传递给读取字符串:

readString 0 input = return input
readString n input = do
z <- getLine
readString (n-1) (z:input)

如果这样做,您会发现您输入的行从末尾开始被放入 input 中——所以它们以相反的顺序出现! (如果您的代码片段有效,它也会以这种方式运行。)一个简单的解决方法是更改​​基本情况:

readString 0 input = return (reverse input)

更惯用的解决方法是完全取消参数,首先简单地以正确的顺序返回内容:

readString 0 = return []
readString n = do
z <- getLine
zs <- readString (n-1)
return (z:zs)

当您熟悉标准库后,您可能会先升级到

readString 0 = return []
readString n = liftA2 (:) getLine (readString (n-1))

然后跳过 readString 的定义,完全支持重写 main:

main = do
n <- readLn
lines <- replicateM n getLine
...

关于loops - 使用 Haskell 读取 n 行输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53131043/

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