使monadic函数调用点免费

时间:2015-03-13 11:59:40

标签: haskell

我有编译的代码:

\f st -> f1 >>= \m-> f2 m f st

f1属于m a类型,f2属于类型a -> b -> c -> m d,属于同一Monad m。我不能为我的生活重写这个表达点,没有丑陋的\ f st和\ m在中间。我想,不是为了美学,而是因为我有其他方程式可以创建相同的函数,我可以编写无点,所以它会使代码更容易理解。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

嗯,这是我的笑话回答:

  • λfst→f1>> =λm→f2 m f st
  • [λfst→f1>> = [λm→f2 m f st]]
  • [λfst→f1>> = S [λm→f2 m f] [λm→st]]
  • [λfst→f1>> = S [λm→f2 m f](K st)]
  • [λfst→f1>> = S(S [λm→f2 m] [λm→f])(K st)]
  • [λfst→f1>> = S(S [λm→f2 m](K f))(K st)]
  • [λfst→f1>> = S(S [f2](K f))(K st)]
  • [λfst→f1>> = S(S f2(K f))(K st)]
  • [λfst→(>> =)f1(S(S f2(K f))(K st))]
  • [λf→[λst→(>> =)f1(S(S f2(K f))(K st))]]
  • [λf→S [λst→(> = =)f1] [λst→S(S f2(K f))(K st)]]
  • [λf→S(K((> =)f1))[λst→S(S f2(K f))(K st)]]
  • [λf→S(K((> =)f1))(S [λst→S(S f2(K f))] [λst→K st])]
  • [λf→S(K((> =)f1))(S [λst→S(S f2(K f))] [K])]
  • [λf→S(K((> =)f1))(S [λst→S(S f2(K f))] K)]
  • [λf→S(K((> =)f1))(S(K(S(S f2(K f))))K)]
  • S [λf→S(K((> =)f1))] [λf→S(K(S(S f2(K f))))K]
  • S(K(S(K((> =)f1))))[λf→S(K(S(S f2(K f))))K]
  • S(K(S(K((> =)f1))))(S [λf→S(K(S(S f2(K f))))] [λf→K ])
  • S(K(S(K((&gt; =)f1))))(S [λf→S(K(S(S f2(K f))))](KK))< / LI>
  • S(K(S(K((&gt; =)f1))))(S(S [λf→S] [λf→K(S(S f2(K f)))] )(KK))
  • S(K(S(K((&gt; =)f1))))(S(S(KS)[λf→K(S(S f2(K f)))])(KK ))
  • S(K(S(K((&gt; =)f1))))(S(S(KS)(S [λf→K] [λf→S(S f2(K f)) )]))(KK))
  • S(K(S(K((&gt; =)f1))))(S(S(KS)(S(KK)[λf→S(S f2(K f))]) )(KK))
  • S(K(S(K((&gt; =)f1))))(S(S(KS)(S(KK)(S [λf→S] [λf→S f2( K f)])))(KK))
  • S(K(S(K((&gt; =)f1))))(S(S(KS)(S(KK)(S(KS)[λf→S f2(K f) ])))(KK))
  • S(K(S(K((&gt; =)f1))))(S(S(KS)(S(KK)(S(KS)(S [λf→S f2] [ λf→K f]))))(KK))
  • S(K(S(K((&gt; =)f1))))(S(S(KS)(S(KK)(S(KS)(S(K(S f2))[ λf→K f]))))(KK))
  • S(K(S(K((&gt; =)f1))))(S(S(KS)(S(KK)(S(KS)(S(K(S f2))[ K]))))(KK))
  • S(K(S(K((&gt; =)f1))))(S(S(KS)(S(KK)(S(KS)(S(K(S f2))K )))))(KK))

函数S和K由

定义
k :: x -> y -> x
k x y = x

s :: (x -> y -> z) -> (x -> y) -> (x -> z)
s f g x = (f x) (g x)

任何试图真正使用它的人当然都是疯了。 ; - )