FizzBuzz

Arrowを使いまくる形に変形しようと思ったんだけど、なんか、非本質的なところであまりに苦労しているので、変形前のFizzBuzz関数:

module Main where
import Control.Arrow

fizzbuzz :: [(Int, String)] -> [Int] -> [String]
fizzbuzz =  map . step

step :: [(Int, String)] -> Int -> String
step ps = (id ||| show) . (step' ps)

step' :: [(Int, String)] -> Int -> Either String Int
step' [] n = Right n
step' ((inter, msg):t) n
  = let e = step' t n
    in if n `mod` inter == 0
       then Left (msg ++ (id ||| (const "")) e)
       else e

main :: IO ()
main = print $ fizzbuzz [(3, "Fizz"), (5, "Buzz")] [1..20]
$ runghc FizzBuzz.hs
["1","2","Fizz","4","Buzz","Fizz","7","8","Fizz","Buzz","11","Fizz","13","14","FizzBuzz","16","17","Fizz","19","Buzz"]

(|||)の使い方が飲み込めてきたような気がする。また、これには反映されていないけどloopもいろいろ試してみた。あとは、arrとKleisliを試してみたら、Arrowのお勉強はひとまず終了かな。