Mel*_*oos 0 haskell loops input getline
我正在努力学习编写Haskell程序.我无法读取n行输入.
输入是
ñ
ab(<----- n次)
其中n,a,b是数字.
我试过了
input = []
readString 0 = return()
readString n =
do
z <- getLine
z:input
readString (n-1)
main = do
n <- getLine
readString n
Run Code Online (Sandbox Code Playgroud)
这引发了错误.如何在Haskell中正确循环读取?
Haskell是不可变的:一旦你写完
input = []
Run Code Online (Sandbox Code Playgroud)
然后input是[]永远,永远,阿门.您可以使用与"变化"值相同的技术n来获得"更改"值input,即将其作为参数传递给readString:
readString 0 input = return input
readString n input = do
z <- getLine
readString (n-1) (z:input)
Run Code Online (Sandbox Code Playgroud)
如果你这样做,你会发现你输入的行input从最后开始 - 所以它们以相反的顺序出现!(如果您的代码片段有效,它也会以这种方式运行.)一个简单的解决方法是更改基本情况:
readString 0 input = return (reverse input)
Run Code Online (Sandbox Code Playgroud)
一个更惯用的解决方法是完全废除这个论点,只是首先以正确的顺序返回事物:
readString 0 = return []
readString n = do
z <- getLine
zs <- readString (n-1)
return (z:zs)
Run Code Online (Sandbox Code Playgroud)
当您对标准库感到满意时,您可能会首先毕业
readString 0 = return []
readString n = liftA2 (:) getLine (readString (n-1))
Run Code Online (Sandbox Code Playgroud)
然后跳过readString完全有利于重写的定义main:
main = do
n <- readLn
replicateM n getLine
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |