Предположим, например, что у нас есть следующая структура данных:
data Foo = Bool Bool | Int Int | Double Double
Теперь есть более простой способ сделать это:
foo :: Typeable a => a -> Foo
foo x = maybe (error "i dunno") id $
liftM Bool (cast x) `mplus`
liftM Int (cast x) `mplus`
liftM Double (cast x)
Кто-нибудь задумывался о создании синтаксиса для сопоставления с образцом на набираемых типах?