2017-09-02 9 views
0

多くのletステートメントで関数を定義しようとしていますが、エラーが発生し続けます。parse error on input 'let'。私はまだハスケルに新しいので、実際にこの問題の原因を見ることはできません。ここで複数のletブロックを入力として `let 'を解析するとエラーが発生する

は私の関数である。それが問題とは無関係であるので、私は関数が行うことになっているかを説明しません

myFunc :: ([String], Int) -> (Int, Int, Int) -> ([String], Int) 
nextGuess (prev_string, prev_int) (a1, a2, a3) = (new_string, new_int) 
    let new_int_1 = if a3 - a1 < 0 
     then prev_int 
     else (filter (myPred1 a3 prev_string) prev_int) 
    let new_int_2 = if a2 - a1 < 0 
     then new_int_1 
     else (filter (myPred2 a2 prev_string) new_int_1) 
    new_int = filter (myPred3 a1 prev_string) new_int_2 

、私の主な問題は、最初letにパースエラーが存在することです私は理由を知らない。

+1

他の人は、すでにここで '〜'と ''どこ 'の違いについて答えているのですか?しかし、インデントに関しては、「do」、「let」などのレイアウトキーワードの後に​​改行+インデントしただけでは、問題にならないようになり(問題の整列を行う必要はありません) 、 'where'、' case' ... 'of'などがあります。 –

答えて

2

問題は、機能を使用した後にletで機能を定義していることですが、反対の目的のためにはです。

あなたがここにwhereを使用することができますので、あなたは、Let vs. Where記事を参照することもできます。

nextGuess (prev_string, prev_int) (a1, a2, a3) = (new_string, new_int) 
    where 
     new_int_1 = if a3 - a1 < 0 
     then prev_int 
     else (filter (myPred1 a3 prev_string) prev_int) 
     new_int_2 = if a2 - a1 < 0 
     then new_int_1 
     else (filter (myPred2 a2 prev_string) new_int_1) 
     new_int = filter (myPred3 a1 prev_string) new_int_2 

またはlet inを:

nextGuess (prev_string, prev_int) (a1, a2, a3) = 
    let new_int_1 = if a3 - a1 < 0 
      then prev_int 
      else (filter (myPred1 a3 prev_string) prev_int) 
     new_int_2 = if a2 - a1 < 0 
      then new_int_1 
      else (filter (myPred2 a2 prev_string) new_int_1) 
     new_int = filter (myPred3 a1 prev_string) new_int_2 
     in 
      (new_string, new_int) 

またはdo notation

nextGuess (prev_string, prev_int) (a1, a2, a3) = do 
    let new_int_1 = if a3 - a1 < 0 
      then prev_int 
      else (filter (myPred1 a3 prev_string) prev_int) 
    let new_int_2 = if a2 - a1 < 0 
      then new_int_1 
      else (filter (myPred2 a2 prev_string) new_int_1) 
    let new_int = filter (myPred3 a1 prev_string) new_int_2 
    (new_string, new_int) 
1

let-expressionsであるべきフォーム

let pattern_1 = expression_1 
    pattern_2 = expression_2 
    ... 
in final_expression 

ので、あなたのケースでは、このような何か:

myFunc :: ([String], Int) -> (Int, Int, Int) -> ([String], Int) 
nextGuess (prev_string, prev_int) (a1, a2, a3) = 
    let new_int_1 = if a3 - a1 < 0 
      then prev_int 
      else (filter (myPred1 a3 prev_string) prev_int) 
     new_int_2 = if a2 - a1 < 0 
      then new_int_1 
      else (filter (myPred2 a2 prev_string) new_int_1) 
     new_int = filter (myPred3 a1 prev_string) new_int_2 
    in (new_string, new_int) 

(。inが必要ですが、それは特別だしないdo-expressions内部letの使用があります)

代わりに、追加の宣言は、バインディングのオプションのwhereの中に入れることができます。

myFunc :: ([String], Int) -> (Int, Int, Int) -> ([String], Int) 
nextGuess (prev_string, prev_int) (a1, a2, a3) = (new_string, new_int) where 
    new_int_1 = if a3 - a1 < 0 
     then prev_int 
     else (filter (myPred1 a3 prev_string) prev_int) 
    new_int_2 = if a2 - a1 < 0 
     then new_int_1 
     else (filter (myPred2 a2 prev_string) new_int_1) 
    new_int = filter (myPred3 a1 prev_string) new_int_2 
関連する問題