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))