我对haskell非常陌生,我的任务是创建一个合并排序n个整数的程序。程序询问要排序多少个元素,要排序的元素将被逐行输入。我甚至还没有得到排序,但我有麻烦,存储一行一行的输入在一个列表。这是我目前掌握的信息。
storedelems = []
inputelems 0 = return storedelems
inputelems n =
do
storedelems <- getLine
inputelems (n-1)
main = (inputelems 4)
当我按行号输入我想要排序的行时,它只返回[]
当你运行inputelems 4
时,你只是读到storedelems
一行,然后忘记它,在所有难忘的读取之后,你只是返回全局storedelems
,你定义为[]
。
有replicateM
函数。要使用它,首先必须导入模块Control.Monad
:
import Control.Monad (replicateM)
现在你可以这样使用:
main = replicateM 4 getLine
因此,现在main
读取4行并创建已读字符串列表。
如果你想要一个整数列表,你可以修改main
:
main :: IO [Int]
main = replicateM 4 (read <$> getLine)
但是你必须意识到,如果你的函数将被命名为main
是错误的,因为main
是特殊的函数,必须具有类型IO ()
。
你也可以这样修改你的解决方案:
inputelems 0 = return []
inputelems n =
do
storedelem <- getLine
(storedelem : ) <$> inputelems (n-1)
现在你的storedelem
不会被忘记了。