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のお勉強はひとまず終了かな。