web-dev-qa-db-ja.com

Haskellの複数のwhereステートメントの方法はありますか

1つの関数で3-4whereステートメントを書き込もうとしましたが、エラーが発生して実行できませんでした。次のようなことを実行しようとしました。

foo x=
| x == foo1 = 5
| x == foo2 =3
| x == foo3 =1
| otherwise =2 
where foo1= samplefunct1 x
      foo2= samplefunct2 x
      foo3= samplefunct3 x

私はコードが少し役に立たないことを知っていますが、私は私が何を意味するかについての例を与えるためにこれを書いただけです。

私を助けることができる人はいますか?前もって感謝します。

17
caesar_

=の後のfoo xを削除し、次のようにコードをインデントします

foo x
    | x == foo1 = 5
    | x == foo2 =3
    | x == foo3 =1
    | otherwise =2 
    where foo1 = samplefunct1 x
          foo2 = samplefunct2 x
          foo3 = samplefunct3 x

そして、あなたは元気です。

26
gspr

次のように、インデントが少し不均一な場合:

foo x
 | x == foo1 = 5
 | x == foo2 =3
 | x == foo3 =1
 | otherwise =2 
 where foo1= samplefunct1 x
        foo2= samplefunct2 x
         foo3= samplefunct3 x

実際、エラーメッセージは予期しない=について説明しています。 (そして将来的には、質問の本文に完全なエラーメッセージを含めてください)。

このエラーを修正するには、再調整するか、明示的な区切り文字{ ; }を使用して、空白を無視します。

foo x
 | x == foo1 = 5
 | x == foo2 =3
 | x == foo3 =1
 | otherwise =2 
 where { foo1= samplefunct1 x ;
        foo2= samplefunct2 x ;
          foo3= samplefunct3 x }

これは問題なく動作します(使用するのに適したスタイルではありません)。時々それはあなたにも見えますが、そうではありませんタブ文字空白に隠れている場合。

10
Will Ness

このコードはほぼ正しいので、正しいインデントが必要です。空白はhaskellで重要です。さらに、fooの後に=を使用すると、ガードのエラーになるため、それも削除する必要があります。結果は次のとおりです。

foo x
  | x == foo1 = 5
  | x == foo2 =3
  | x == foo3 =1
  | otherwise =2 
  where foo1= whatever1 x
        foo2= whatever2 x
        foo3= whatever3 x
9
Daniel Gratzer