Автоматическое преобразование инфиксных операторов в монадические инфиксные операторы

Один из Самое приятное в Haskell - это возможность использовать инфиксную нотацию.

1 : 2 : 3 : []    :: Num a => [a]
2 + 4 * 3 + 5     :: Num a => a

Но эта сила внезапно и, к сожалению, теряется, когда оператора нужно поднять.

liftM2 (*) (liftM2 (+) m2 m4) (liftM2 (+) m3 m5)
liftM2 (:) m1 (liftM2 (:) m2 (liftM2 (:) m3 mE))

Можно определить похожие операторы, чтобы восстановить эту мощность

(.*) = liftM2 (*)
(.+) = liftM2 (+)
(.:) = liftM2 (:)

m1, m2, m3, m4, m5 :: Monad m, Num a => m a
mE = return []     :: Monad m => m [a]
m1 .: m2 .: m3 .: mE    :: Monad m, Num a => m [a]
m2 .+ m4 .* m3 .+ m5    :: Monad m, Num a => m a

Но утомительно переименовывать каждый оператор, который я хочу использовать в монадическом контексте. Есть ли способ лучше? Может быть, шаблон Haskell?

9
задан Dan Burton 12 October 2011 в 15:34
поделиться