Haskell の優れた点の 1 つは、中置記法を使用できることです。
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 でしょうか。