70260


sample.hs という名前のファイルに、ifのみを使って3つの数字の中で一番大きな数を出力する関数 `maxif3(x,y,z)`
を以下のように作りました。

[code]

    max3if(x,y,z)=if x>y>z then x 
                  else if x>z>y then x
                  else if y>x>z then y
                  else if y>z>x then y
                  else if z>x>y then z
                  else if z>y>x then z
    
[/code]

しかし、コンパイルしたとき、このようなエラーが出てしまいました。

[code]

    Prelude> :l sample.hs
    [1 of 1] Compiling Main             ( sample.hs, interpreted )
    
    sample.hs:187:1: error:
        parse error (possibly incorrect indentation or mismatched brackets)
    Failed, modules loaded: none.
    
[/code]

自分のプログラムについて、どこが間違っているのかがわからなかったので聞いた次第です。  
また、できればエラーの意味も教えてほしいです。お願いします。


CC BY-SA 4.0
2020-09-09T12:42:28.270
70259
2020-09-09T22:44:16.257
2020-09-09T22:44:16.257
32986
41837
question
haskell
エラーの意味がわかりません: parse error (possibly incorrect indentation or mismatched brackets)


`if` は必ず `then` と `else` の両方が必要です。エラーの意味は、適切にインデントされた `else` を期待しており、`else`
以前にインデントがおかしいので `incorrect indentation` と表示されています。

プログラムの意味は一旦考えずにおいて、このエラーに対処するには次のようなコードになります。

[code]

    max3if(x,y,z)=if x>y>z then x 
                  else if x>z>y then x
                  else if y>x>z then y
                  else if y>z>x then y
                  else if z>x>y then z
                  else if z>y>x then z
                  else x
    
[/code]

しかしこのコードにはまだエラーがあります。1つだけ掲載すると下記です。同じエラーが複数あります。

[code]

    sample.hs:1:18: error:
        Precedence parsing error
            cannot mix ‘>’ [infix 4] and ‘>’ [infix 4] in the same infix expression
      |
    1 | max3if(x,y,z)=if x>y>z then x
      |
    
[/code]

`>` 関数に結合性がないにもかかわらず連続した書いているのがいけません。これは次のように書く必要があります。

[code]

    max3if(x,y,z)=if x>y && y>z then x 
                  else if x>z && z>y then x
                  else if y>x && x>z then y
                  else if y>z && z>x then y
                  else if z>x && x>y then z
                  else if z>y && y>x then z
                  else x
    
[/code]

これで構文エラー、型エラーともになくなり実行できます。


CC BY-SA 4.0
2020-09-09T13:15:01.033
70260
2020-09-09T13:15:01.033
153
70259
answer