2012-03-15 14 views
16

パターンマッチでは成り立たない(つまり、パターンごとに 'where'句を書き直す必要がある)ことはわかっていますが、ガードのスコープはどのように機能しますか?ハスケルでは、ガードを扱うときのwhere句の範囲は何ですか?

これは機能しますか?

myFunction x1 x2 
    | x1 > x2 = addOne x1 
    | x1 < x2 = addOne x2 
    | otherwise = x1 
     where addOne = (1+) 

これはこれでしょうか?

myFunction x1 x2 
    | x1 > x2 = addOne x1 
     where addOne = (1+) 
    | x1 < x2 = addOne x2 
     where addOne = (1+) 
    | otherwise = x1 

答えて

16

最初のものが正しいです。私はあなたには、haskell wikiのlet vs whereページを見てみることをお勧めします。これは良い読書です(また、スコープの扱い方も説明しています)。 メモと同様に、同じ定義を繰り返すべきではありません。それは、コードを別の方法で構造化する必要があるという兆候です。

5

where句の範囲は完全な等式なので、最初の例が有効です。

関連する問題