Arrowを使って、lengthを書こう
30分プログラム、その522。Arrowを使って、lengthを書いてみた。
最初、Arrowでリストってどうやって処理すればいいんだ、と頭をかかえたけど、Arrow の do 記法 - zyxwvの日記を見たら、
listcase [] = Left () listcase (x:xs) = Right (x,xs)
という関数を定義してた。なるほど、EitherにすればArrowChoiceとかが使えるのか。
使い方
*Main> headA [1,2,3] 1 *Main> tailA [1,2,3] [2,3] *Main> lengthA [1,2,3] 3
ソースコード
import Control.Arrow -- http://d.hatena.ne.jp/zyxwv/20070623/1182572614 listcase [] = Left () listcase (x:xs) = Right (x,xs) headA = listcase >>> error "empty list" ||| arr fst tailA = listcase >>> error "empty list" ||| arr snd lengthA = listcase >>> (arr $ const 0) ||| (second (arr lengthA) >>> arr snd >>> arr (+1))