21

1 つの関数に 3 ~ 4 の where ステートメントを記述しようとしましたが、エラーが発生して実行できませんでした。そのようなことをしようとしました。

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

私はコードが少し役に立たないことを知っていますが、私が何を意味するかについての例を示すためにこれを書きました.

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

4

3 に答える 3

36

=後を削除し、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

そして元気です。

于 2013-04-01T09:11:41.870 に答える
13

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

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 }

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

于 2013-04-01T13:12:43.100 に答える
11

このコードはほぼ正しいです。正しいインデントが必要なだけです。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
于 2013-04-01T09:11:54.517 に答える