ソースコードから想像するに、やりたいことはこういうことでしょうか?(Wandbox)
haskell
1main :: IO ()
2main = do
3 n <- readLn :: IO Int
4 -- readLn で1行読み込み、Int 型の値に変換します
5 -- readLn はいろいろな型の値を読むことができるので「Int 型の値を読む」と明示します
6 -- readLn の型が IO Int となっているのは readLn が手続きであることを表わしています
7 -- do 式の中で <- を使うと手続きの結果を受け取れます
8 let
9 -- do 式の中で変数を使う場合は let 構文で導入します
10 x = []
11 y = [n]
12 -- 後で ++ するので、y は [Int] 型でないといけません
13 x' = x ++ y
14 -- Haskell では変数の再束縛ができないので、新しく変数を導入します
15 print x' -- ==> [1]
整数を受け取り、一個目は空のリストへ格納してそれは以降はappendして行きたいです。
こちらから想像すると、こういうことでしょうか?(Wandbox)
haskell
1import System.IO (isEOF)
2
3main :: IO ()
4main =
5 loop []
6 -- 下で定義する loop 関数を呼びます
7 -- Haskell では組み込みのループがないため再帰関数を使います
8 -- Data.Traversable.for を使う方法もあります
9 where
10 loop :: [Int] -> IO ()
11 loop l = do
12 -- l の部分が更新される値です
13 eof <- isEOF
14 if eof
15 then return ()
16 -- EOF の場合はループを抜けます
17 else do
18 n <- readLn
19 let l' = l ++ [n]
20 print l'
21 loop l'
22 -- 更新後の値である l' を渡し loop 関数を呼びます
質問者のコードとそのエラーの解説をします。
haskell
1n = getLine >>= putStrLn
2-- 「これは getLine をして、読み込んだ値を putStrLn に渡す」という「手続き」を表わします
3-- 「手続き」そのものなので実行されておらず n の型は IO () となります
4x = []
5y = n
6x ++ y
7-- Parse error: naked expression at top level
8-- トップレベルに束縛や import 以外の式は書けません
9main = print y
意図した動作をする Python コードが追記されたので、それに対応する Haskell コードを追記します。
haskell
1main :: IO ()
2main = do
3 li = []
4 i <- readLn :: IO Int
5 let li' = li ++ [i]
6 print li'