

コード6行目に表題のエラーが出て原因がわかりません。  
インデントもしてるし余分な=も入ってないのにエラーになる原因が見つけられません。  
ご指導のほどよろしくお願いします。

[code]

    data T = T {x::Either _ Int, y::Maybe Int}
    f = \t -> case t of
      T x y
        Just y
          | x :: Right Int -> x+y
          | x :: Left _ -> x
        Nothing -> 0
        _ -> undefined
    
[/code]


CC BY-SA 4.0
2019-10-21T19:22:50.850
59855
2019-10-22T02:16:30.760
2019-10-21T20:03:07.543
32986
36198
question
haskell
Haskellにてparse error on input |の原因がわかりません


やりたいのは、`T`型の値`y`が`Just`の場合と`Nothing`の場合とで処理を分けたい、ということでしょうか？  
その場合、下記のように、もう一つ`case`式を書かないといけません。

[code]

    data T = T {x::Either _ Int, y::Maybe Int}
    f = \t -> case t of
      T ex my ->
          case my of
            Just y ->
              case ex of
                  Right x -> x + y
                  Left e -> e
            Nothing -> 0
      _ -> undefined
    
[/code]

上記の書き換え方の例の通り、残念ながら、`x`が`Right`の場合と`Left`の場合とでのかき分け方も正しくありません（ガード構文と間違えている？）。

`case`式の使い方についてさらに指摘しますと、`T`型のように値コンストラクターが一つだけの型の値については、`case`式で場合分けする必要はありません。  
以下のように、関数の引数でパターンマッチすれば十分でしょう。

[code]

    data T = T {x::Either _ Int, y::Maybe Int}
    f (T ex my) =
        case my of
          Just y ->
            case ex of
                Right x -> x + y
                Left e -> e
          Nothing -> 0
    
[/code]

`case`式の場合と異なり、関数の引数で直接パターンマッチする場合、`(T ex my)`のように、カッコで囲うのを忘れないでください。

入れ子のパターンマッチと関数の引数でのパターンマッチ両方を活用すると、下記のようにも書けます。

[code]

    data T = T {x::Either _ Int, y::Maybe Int}
    f (T (Right x) (Just y)) = x + y
    f (T _         Nothing)  = 0
    f (T (Left e)  _)        = e
    
[/code]

※一度のパターンマッチですべての引数をパターンマッチさせてる関係上、マッチさせる順番を少し入れ替えている点にご注意ください。

また、このコードのコンパイルエラーをなくすには、さらに`T`型の定義を変え必要があります。

[code]

    data T = T {x::Either _ Int, y::Maybe Int}
    
[/code]

の、`Either _ Int`の箇所ですが、型定義における型注釈で`_`という構文を使用することはできません。  
`case`式を直しても、下記のようなエラーが出るでしょう。

[code]

        Wildcard ‘_’ not allowed
          in the definition of data constructor ‘T’
      |
    1 | data T = T {x::Either _ Int, y::Maybe Int}
      |            
    
[/code]

なので、適当な型を指定する必要があります。  
どの型にするべきか、についてはこの回答では割愛します。質問者がそもそもやりたいことがなんなのかがわからないので。


CC BY-SA 4.0
2019-10-22T02:16:30.760
59864
2019-10-22T02:16:30.760
8007
59855
answer