4

let他の表現の中で使うことができます。

foo n = (let a = True in (\x -> a)) 3

foo' n | n == 1 = let a = True in a
       | n /= 1 = False

しかし、私は同じことをすることはできませんwhere

foo n = ((\x -> a) where a = True) 3

foo' n | n == 1 = a where a = True
       | n /= 1 = False

1:20:入力`where'の解析エラー

Haskellでは本当に不可能ですか、それとも私の間違いですか?

4

4 に答える 4

10

letは式whereですが、節です。wherelet は構文構造にバインドされているため、式が使用できる場所ならどこでも使用できます。

もちろん、次のように書くこともできます。

foo n = ((\x -> a)) 3 where a = True

foo' n | n == 1 = a
       | n /= 1 = False
       where a = True

またはこのように:

foo n = (\a -> (\x -> a) 3) True
于 2012-10-09T20:45:53.277 に答える
4

where句を最後に置く必要があります。

foo n = ((\x -> a)) 3
  where a = True

foo' n | n == 1 = a
       | n /= 1 = False
  where a = True

違いはlet、それが式であるのに対し、where他の構造体をバインドする必要があることです。let と whereを参照

于 2012-10-09T20:45:05.120 に答える
1

let ... in ...式に名前バインディングを導入するためのものです。

whereは、方程式とともに局所的な補助定義を与えるための便利な構文です。任意の式の途中ではなく、式の一部として (最後に) のみ使用できます。

それらの使用法は同じではありません。

于 2012-10-09T20:52:51.247 に答える
0

表現であるという主張letは少しずれているように思えます。ブロック内doではステートメントですが、そこでは省略されていると言いlet ... inます。言うべきことは、私が思うに、

 let_in_ :: Statement -> Expression -> Expression
 _where_ :: Statement -> Statement  -> Statement

したがって、 a の最初の部分はletステートメントであり、 a によって変更できますwhere。たとえば

 foo n = (let a = b where b = True in (\x -> a)) 3

 bip = do 
     let a = b where b = let c = d where d = True in c
     return a

同様に、次のように言えます。

 case_of_ :: Expression -> [Statement] -> Expression

そのように例えば

z x = case even x of 
   True -> d where d = x + 1
   False -> w - 1 where w = let a = x in a + 1 
于 2012-10-10T16:53:42.960 に答える