List 如何从Haskell中的IO添加到列表。

List 如何从Haskell中的IO添加到列表。,list,haskell,io,List,Haskell,Io,我正在尝试编写一个简单的函数,它一次读取一行,我知道这将是整数,然后将它们存储到一个列表中。然而,就我的一生而言,这份清单似乎是空的 import System.IO import Control.Monad type Int2 = [Int] valueTab = [] :: [Int] app [ ] list = list app (h:t) list = h:(app t list) main :: IO () main = do hSetBuffering stdou

我正在尝试编写一个简单的函数,它一次读取一行,我知道这将是整数,然后将它们存储到一个列表中。然而,就我的一生而言,这份清单似乎是空的

import System.IO
import Control.Monad

type Int2 = [Int]

valueTab = [] :: [Int]

app [ ] list = list 
app (h:t) list = h:(app t list)

main :: IO ()
main = do
    hSetBuffering stdout NoBuffering -- DO NOT REMOVE

    -- Auto-generated code below aims at helping you parse
    -- the standard input according to the problem statement.

    input_line <- getLine
    let n = read input_line :: Int
    let value = [] :: [Int]

    replicateM n $ do
        input_line <- getLine
        let pi = read input_line :: Int
        hPutStrLn stderr (show input_line)
        hPutStrLn stderr (show valueTab)
        return $ app valueTab [pi]


    -- hPutStrLn stderr "Debug messages..."

    -- Write answer to stdout


    --putStrLn input_line
    return ()
所以,当我用 8. 6. 4. 3.各自为政, 它打印6、[]、4、[]、3[]

这是我的打印、列表声明、存储方式的问题吗?我有value和valueTab来检查它是否是范围问题


注意:该代码是编码网站上的样板代码,该网站在其平台上对其进行测试。假设ReplicatItem只是一个循环,它在代码x中运行了多次

看来你在codinggame.com上遇到了问题。其他编码站点似乎在Haskell模板方面做得更好,特别是对于初学者练习来说——模板通常负责所有的输入和输出,您只需要提供缺少的纯函数。相比之下,codinggame.com的Haskell模板似乎假设初学者对IO monad有着相当坚定的理解,并忽略了许多重要的细节,例如,replicateM操作的结果实际上应该绑定到一个您希望填写的变量

原始模板中的replicateM调用可能类似于:

replicateM n $ do
    input_line <- getLine
    let pi = read input_line :: Int    -- maybe this line was there, maybe not
    return ()
您不需要helper函数应用程序,也不需要预先声明list valueTab来包含结果。结果是由replicateM自动生成的,您只需对其命名即可使用它

完整的工作程序如下所示:

import System.IO
import Control.Monad

type Int2 = [Int]

main :: IO ()
main = do
    hSetBuffering stdout NoBuffering -- DO NOT REMOVE

    -- Auto-generated code below aims at helping you parse
    -- the standard input according to the problem statement.

    input_line <- getLine
    let n = read input_line :: Int
    let value = [] :: [Int]

    pis <- replicateM n $ do
        input_line <- getLine
        let pi = read input_line :: Int
        return pi

    hPutStrLn stderr (show pis)

    -- hPutStrLn stderr "Debug messages..."
    -- Write answer to stdout

    return ()

Haskell上的变量是不可变的。您正在评估应用程序valueTab[pi],顺便说一句,该应用程序可能已写入valueTab++[pi],但这不会更改valueTab的值。它不能。valueTab永远是一个空列表。o作为复制项函数的结果,它是一个返回值的函数,可能会很有趣,但您从未对它做过任何操作。也许可以尝试探索这种可能性。如果允许你扔掉样板文件,你可能会发现用互动、文字、地图和阅读来写这篇文章要简单得多。感谢haskell中的见解。我知道我在这个问题上想了太多Java了,哈哈。非常感谢你的解释。我不敢相信它是那么简单,同时,我也永远无法仅仅通过看它就明白这一点。但是从你的解释来看,我对这里的概念有一点更深刻的理解。现在我可以开始尝试解决这个难题了!再次感谢您抽出时间回答。而且,把它钉在头上做得很好,因为它是从codingame来的!
import System.IO
import Control.Monad

type Int2 = [Int]

main :: IO ()
main = do
    hSetBuffering stdout NoBuffering -- DO NOT REMOVE

    -- Auto-generated code below aims at helping you parse
    -- the standard input according to the problem statement.

    input_line <- getLine
    let n = read input_line :: Int
    let value = [] :: [Int]

    pis <- replicateM n $ do
        input_line <- getLine
        let pi = read input_line :: Int
        return pi

    hPutStrLn stderr (show pis)

    -- hPutStrLn stderr "Debug messages..."
    -- Write answer to stdout

    return ()