let, where, let-in
https://haskell.e-bigmoon.com/posts/2019/08-24-let-where-letin.html
let を使うタイミング (do の中)
do
の中で束縛された変数x
を使って新しい変数y
を宣言したい時let
はdo
とリスト内包表記でしか使えないdo の変換:
do {let decls; stmts} = let decls in do {stmts}
リスト内包表記の変換:
[ e | let decls, Q ] = let decls in [ e | Q ]
where
ではx
を宣言できないlet-in
を使うとインデントがとても面倒let
とin
の先頭を合わせるとコンパイルエラーになる
他の変数に依存していない
z
はどの書き方でも良いが、この場合、普通はlet
で書くことが多いと思うdo
が巨大だとwhere
で宣言されている変数までの距離が遠いため、可読性が落ちる
where を使うタイミング (ガード)
このように、ガードで共通する変数を宣言する場合に
where
を使うと見通しが良くなります。もし
let-in
を使って同じように書く場合はMultiWayIf
を使うことになるでしょう。do
の中ではないため、当然let
は使えません
let-in を使うタイミング
こんな感じの関数を書くときにはとても便利です
ただ、このようなケースというのはあまり遭遇しないので、個人的には使わないようにしています。無くてもほぼ困らないです
理由1: レイアウトルールを気にしなければならない点がとても面倒 (1行なら問題無い)
理由2: ポイントフリースタイルで書くのが好きなので
where
で書くと、let-in
で書いたときよりも可読性が落ちてしまったように思います
where と let-in の違い
let-in
と where
の明確な違いは let-in
が式なのに対して where
が節だという点です。
構文上のどこに式が出現できるかという規則については Language Report に詳しく記載されています。
検討事項
where
とlet-in
の最適化Strict
拡張
参考リソース
すごいHaskellたのしく学ぼう!
Programming in Haskell 2nd Edition
Last updated