質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

Q&A

解決済

2回答

997閲覧

Haskellのエラーやはり独特なものが多いのですかね? Parse error: naked expression at top level

退会済みユーザー

退会済みユーザー

総合スコア0

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

0グッド

1クリップ

投稿2018/08/18 21:08

編集2018/08/19 12:10

###該当のエラー

Main.hs:4:1: Parse error: naked expression at top level Perhaps you intended to use TemplateHaskell

該当のソースコード

n = getLine >>= putStrLn x = [] y = n x ++ y main = print y

試したこと

整数を受け取り、一個目は空のリストへ格納してそれは以降はappendして行きたいです。

補足情報

Python3のユーザーですが
別の言語も覚えようと思いやってきましたど新人です。

やりたい事はpython3で書くと

li = [] i = int(input()) li.append(i) print(li)

こんな感じです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2018/08/19 01:32 編集

質問は"Haskellのエラーやはり独特なものが多いのですかね?"ですか?
igrep

2018/08/19 02:37

ひとまず問題のエラーを解決することが目的なら、問題のエラーメッセージである「Parse error: naked expression at top level」を質問のタイトルに含めてください。
kakkun61

2018/08/19 02:40

やりたいことを Python で提示していただいた方が回答が得やすいかもしれません。
quickquip

2018/08/19 15:17

結局知りたいことがなんなのかわからないという。
guest

回答2

0

取り急ぎ問題のエラーについて解説します。

Haskellでは、残念ながらPythonのように、
x ++ y というような、「計算式」を「トップレベル」に書くことができません。
x ++ yは「xyを結合する」ための「計算式」です。

問題のエラーでは

Main.hsの4行目の1桁目に「計算式」があるよ!

と言っています。

「トップレベル」という単語は、単純に言うと、
「ソースコードの中で1桁もインデントされてない箇所」
です。

これは、Haskellでは「あらゆる『計算式』の計算はmain関数から始める」というルールがあるため、
main関数の中以外に「計算式」を書いてもいつ計算するのかわからなくなってしまうためです。

(余談ですがこれは全くHaskell固有の話ではなく、C言語やJavaなどにも同じルールがあります)

直すには、 x ++ y という「計算式」を別の変数に代入してください。
例えば

appended = x ++ y

のように書いて、appendedという変数にx ++ yを代入してあげてください。

これを直した後も、多くのエラーが出るかと思います。
わからなくなったら別の質問を作ってください。

新しい言語を学ぶこと、特にHaskellのような、ほかのプログラミング言語と異なる特徴が多い言語を学ぶことは、非常に大変なことかと思います。
辛抱強く取り組んでいただけると幸いです。

投稿2018/08/19 02:32

編集2018/08/19 02:33
igrep

総合スコア428

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/08/19 20:55

とっても励みになります。ありがとうございます。
guest

0

ベストアンサー

ソースコードから想像するに、やりたいことはこういうことでしょうか?(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'

投稿2018/08/19 02:30

編集2018/08/19 11:39
kakkun61

総合スコア285

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/08/19 20:48

とっても細かくありがとうございます! doはまだわからないことが多いですが 案外コードが短く書ける驚きで希望が 持てました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問