Haskell Pipes: 理解“for equality”的逻辑

3
Pipes教程中,它说这个:
 -- s :: Monad m =>      Producer a m ()  -- i.e. 'P.stdinLn'
 -- f :: Monad m => a -> Producer b m ()  -- i.e. 'duplicate'
 -- g :: Monad m => b -> Producer c m ()  -- i.e. '(lift . putStrLn)'    
 for (for s f) g = for s (\x -> for (f x) g)

加上这个:
 (~>) :: Monad m
      => (a -> Producer b m ())
      -> (b -> Producer c m ())
      -> (a -> Producer c m ())
 (f ~> g) x = for (f x) g

等于这个:

 f :: Monad m => a -> Producer b m ()
 g :: Monad m => b -> Producer c m ()
 h :: Monad m => c -> Producer d m ()
 (f ~> g) ~> h = f ~> (g ~> h)

这对我来说毫无意义。能否有人澄清一下吗?

2
使用 ~> 的定义扩展表达式 (f ~> g) ~> h = f ~> (g ~> h)。结果与第一个定理完全相同,但稍微更具体:all y . for (for (f y) g) h = for (f y) (\x -> for (g x) h) - user2407038
也许如果将 ~> 的定义改写为 (~>) = \f g x -> for (f x) g,阅读起来会更容易一些?我能理解同时使用中缀和后缀符号可能会引起混淆。 - chi
我感到困惑,因为 x 已经消失了。对这些推导不太熟悉。 - user1002430
1个回答

2
借鉴评论的提示,我已经弄清楚了。谢谢大家。
首先:
  (f ~> g) x =       for (f x) g
  (f ~> g)   = \x -> for (f x) g
  (~>) f g   = \x -> for (f x) g

因此:
        for (for s f) g, s = e x
= \x -> for (for (e x) f) g
= \x -> for ((e ~> f) x) g
= (e ~> f) ~> g

并且

        for s     (\x -> for (f x) g), s = e x
= \x -> for (e x) (\x -> for (f x) g)
= \x -> for (e x) (f ~> g)
= e ~> (f ~> g)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接