Sat Jul 27 16:56:51 JST 2013

データ構築子に中間値記法使えたんだ!

:^: っていう文法があるみたい?

Prelude> data Tree a = Leaf a | Tree a :^: Tree a deriving Show
Prelude> let treeMap f t = case t of { Leaf x -> Leaf $ f x ; l :^: r -> (treeMap f l) :^: (treeMap f r) }
Prelude> treeMap succ ((Leaf 0) :^: (((Leaf 2) :^: (Leaf 3)) :^: (Leaf 4)))
Leaf 1 :^: ((Leaf 3 :^: Leaf 4) :^: Leaf 5)
data Tr a = Lf a | Tr a :^: Tr a deriving Show

instance Functor Tr where
  fmap f (Lf x) = Lf (f x)
  fmap f (l :^: r) = (fmap f l) :^: (fmap f r)

main = print $ a where
  t = ((Lf 1 :^: Lf 2) :^: Lf 3) :^: Lf 4
  a = fmap (+1) t

追記 (Tue Aug 6 10:42:14 JST 2013)

別に :^: じゃなくても,なんだっていいらしい. 使われてないトークンなら で,コロンで挟むようなものは定義されてることがないことに なってるらしいです. 自分で新しく使うのに,後腐れがないだとか