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

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

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

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

Q&A

解決済

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

退会済みユーザー

退会済みユーザー

総合スコア0

Haskell

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

2回答

0グッド

0クリップ

580閲覧

投稿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)

こんな感じです。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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

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

回答2

4

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

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

総合スコア423

Bolshikh_i_mal, KazuyaGosho, tatsuya6502👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

2018/08/19 20:55

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

2

ベストアンサー

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

Bolshikh_i_mal👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

2018/08/19 20:48

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Haskell

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