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

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

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

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

Q&A

解決済

2回答

5597閲覧

Haskellのインデントについての質問です

Bolshikh_i_mal

総合スコア32

Haskell

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

0グッド

0クリップ

投稿2016/08/10 15:59

let a_num x = if x > 100 then x else x * 2

『すごいHaskell たのしく学ぼう!』に
このような例が載っています。
しかし、バージョンの違いからなのか

Main.hs:3:25: parse error (possibly incorrect indentation or mismatched brackets)

こんな感じのエラーが出てしまい
お手上げです。
助けてください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ここのコードブロックだと 1行目が左に寄ってしまうので、
実際にどう書いてるかわかりませんが

haskell

1let a_num x = if x > 100 2then x 3else x * 2

こういうのはエラーになります。

haskell

1-- 1行目を使いたくないので書いたコメント 2let a_num x = if x > 100 3 then x 4 else x * 2

elseがthenより手前でもエラーです。

それ以外だとちょっとわからないですが、以下はうまくいきます。

bat

1d:\work\tt43958>ghci 2Prelude> :set +m 3Prelude> let a_num x = if x > 100 4Prelude| then x 5Prelude| else x * 2 6Prelude| 7Prelude> a_num 9 818 9Prelude> :q 10Leaving GHCi.

( :set +m は複数行入力モード。最後に空のエンター押せばそこまでの行を処理してくれる。)
( やめるときは :unset +m )

  • sample.hs

hs

1import System.IO 2 3main :: IO () 4main = do 5 let a_num x = if x > 100 6 then x 7 else x * 2 8 putStrLn (show (a_num 10))

コンパイルして実行

d:\work\tt43958>ghc sample.hs [1 of 1] Compiling Main ( sample.hs, sample.o ) Linking sample.exe ... D:\work\tt43958>sample.exe 20

ちなみにバージョンは

>ghc --version The Glorious Glasgow Haskell Compilation System, version 8.0.1

で、環境はWindows 10です。

投稿2016/08/10 16:22

flied_onion

総合スコア2604

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

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

Bolshikh_i_mal

2016/08/11 09:59

mainはあった方がいいのでしょうか?
flied_onion

2016/08/11 10:34

いや、無くていいですよ、例の一つとしてあげただけです(ソースファイルだとそのまま検証しやすいかなと思って。) もちろん使ってもいいんですけど、mainが出てくると IOというのを気にしないといけなくなって最初は逆に大変じゃないかな思います。 私が前にその本読んでた時どうやってコードをためしてたのかあまり覚えてなくていろいろ書いてみました。混乱させてしまったのならごめんなさい。
Bolshikh_i_mal

2016/08/11 12:19

でも、ないと 自分のmacでもpaiza.ioで試しても Main.hs:3:25: parse error (possibly incorrect indentation or mismatched brackets) このエラーが出るんですよね。 もうちょっと本を読み進めてみます。
flied_onion

2016/08/11 12:55

なるほど。サンプルだけのファイル状態で実行することができなかったということですね。 とりあえずpaizaに関しては実行することが前提だと思うのでmainが無いと(開始点が決まらない -> 実行可能プログラムが作れないので)ダメでしょう。Macの方はどういきついたかわからないですが試行錯誤で今の状況かと思いますが、ghcもまた実行可能ファイルを作成するためmainが必要です。 最初にちょっと気にはなってたんですけど(なくてもいいんじゃないかなと思ってた程度ですが)、letを消してください。 そして、ghci をhsファイル(sample.hsだったとします)があるところで起動して、 そのファイルをロードします。 Prelude> :l sample.hs [1 of 1] Compiling Main ( sample.hs, interpreted ) Ok, modules loaded: Main. *Main> になると思います。するとモジュールとして読み込まれ、 *Main> a_num 9 18 *Main> と使えると思います(私はこんな感じで大体やってました) ちょっとうまく説明はできない(わたしもそのあたり詳しくないため)ですが、 let を使わなくていい場面でletを使っていて、haskellは letを使う状況可(関数内とか)にあるはずだと考え、「ならば外側の関数はどこだ」とエラーを出していたんだと思います。
Bolshikh_i_mal

2016/08/11 13:02

本当にありがとうございました。 これで、前に進めます!!
guest

0

最近Haskellさわっていないので良く覚えていませんが、
thenelseはインデントをifより下げる必要があるようです。

Haskell/Indentation - Wikibooks, open books for an open world
https://en.wikibooks.org/wiki/Haskell/Indentation

Haskellのインデント
http://blog.kzfmix.com/entry/1201530273

投稿2016/08/10 16:24

argius

総合スコア9388

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問