haskell-jp / mokumoku-online #84

by Brent Yorgey (2009) "Applicative"  読了 よく使う pure (<$>) (<*>) に加えて (<**>) もある(使ったことはナイ)
```λ> [(* 2), (^ 2), (+ 2)] <*> [1..3]
[2,4,6,1,4,9,3,4,5]

λ> [1..3] <**> [(* 2), (^ 2), (+ 2)]
[2,1,3,4,4,4,6,9,5]```
さらに圏論的定式化もあって (**) を加えると `fmap (g *** h) (u ** v) = fmap g u ** fmap h v` とキレイな Laws になる これは Monad の (>>=) による Laws がグチャグチャなのが (>=>) によって書き換えるとキレイになるのに平行している Haskell は実務先行・理論後追(美観化)であるのが分かる:つまり実用上強力であるとともに 噛めば噛むほど味がある ただしそれで歯を折らないよう また脳内爆発に気を付けよう :exploding_head:
今週は「6.6 Mark 4: A separate full laziness pass」で扱っていたサンプルプログラムの処理途中の結果(identifyMFEs 関数の出力)で、
let の局所変数定義の右辺に関数の部分適用が残る原因と対策を確認していました。
原因はまだはっきりと理解できていないですが、局所変数定義の右辺式を等価的に書き換え(`+`の左右を入れ替え)たら、関数の部分適用がなくなった模様です。
とりあえず今のところは、この方法で対応することにして進めていこうと思います。