【发布时间】:2018-02-05 21:02:17
【问题描述】:
我正在尝试编写一个简单的函数,它一次读取一行(我知道这将是整数),然后将它们存储到一个列表中。然而,对于我的生活来说,这个列表似乎是空的。
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 来检查它是否是范围问题。
注意:该代码是在其平台上对其进行测试的编码网站上的样板代码。假设 replicateM 只是一个循环运行代码 x 次。
【问题讨论】:
-
Haskell 上的变量是不可变的。您正在评估
app valueTab [pi](顺便说一下,可能写成valueTab ++ [pi]),但这不会改变valueTab的值。这不可以。valueTab永远是一个空列表。 -
OTOH
replicateM函数的结果(它是一个返回值的函数)可能很有趣,但你永远不会用它做任何事情。也许尝试探索这种可能性。 -
-
感谢您对 haskell 的见解。我看到我在这个问题上想太多 Java 了哈哈。