コラッツ予想がとけたらいいな2

自分の考察を書いていきます。

Haskell の Arrow の練習 その2(FizzBuzz 2)

参考記事

前回


前回の最後の代わり

fb = proc x -> do
  e <- arr (uncurry (++)) <<< r "Fizz".(==0).(`mod`3) &&& r "Buzz".(==0).(`mod`5) -< x
  arr (uncurry (++)) <<< (arr (uncurry r) <<< show *** (=="")) &&& snd -< (x, e)

こっちの独自路線でいこう。
(arr (uncurry r) <<< show *** (==""))の部分は、
Fizz Buzz FizzBuzz でなかったら数値を show したものを吐くんだね。


仕上げ

fb = proc x -> do
  arr (uncurry (++)) <<< (arr (uncurry r) <<< show *** (=="")) &&& snd <<<
    id &&& (arr (uncurry (++)) <<< r "Fizz".(==0).(`mod`3) &&& r "Buzz".(==0).(`mod`5)) -< x

参考記事のほうはおそらく、カッコを減らすために、関数合成で区切りを入れているのだと思う。

proc を消して、

fb = arr (uncurry (++)) <<<
  (arr (uncurry r) <<< show *** (=="")) &&& snd <<<
    id &&& (arr (uncurry (++)) <<< r "Fizz".(==0).(`mod`3) &&& r "Buzz".(==0).(`mod`5))

最後に arr (uncurry (op))演算子化して完成だ。

infixr 2 <+<
(<+<) op f = arr (uncurry op) <<< f

fb = (++) <+<
  (r <+< show *** (=="")) &&& snd <<<
    id &&& ((++) <+< r "Fizz".(==0).(`mod`3) &&& r "Buzz".(==0).(`mod`5))


いやー、これはすごいね。暗号みたいでかっこいい。