let式。

特定の定義のみで有効な束縛ができる。

main = print $ letTest1 5
       
letTest1 n = let x = n + 1
                 y = n + 2
                 z = n + 3
             in x * y * z

where節と似ているけど、以下の2点が違う。

  1. letは式なのでlet自体にも値を持つ、whereは節なので値を持たない
  2. whereは複数のガードにまたがって有効

使い分けとしては、letの場合は新しい変数を導入するため、whereは関数内で新しい関数を定義するのが一般的。


let式、where節の中で関数の引数と同じ名前の引数を使用した場合

main = print $ letTest1 20 10


letTest1 x y = let y = x * x
               in y - 1

20 × 20 - 1で結果は、

399

つまり、let式内の変数が使用される。このことをシャドウィング(shadowing)という。


let式内で変数を相互に参照することもできる。

main = print $ letTest
letTest = let x = 5
              y = x + 2
          in x * y

結果。

35

上から参照、下から参照のどちらでも問題ない。

main = print $ letTest
letTest = let y = x + 2
              x = 5
          in x * y

結果は同じになる。


パターンでの束縛も可能。

main = print $ letTest

letTest = let(x:xs) = [1,2,3]
          in xs

結果。

[2,3]


ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門