如何实施"第一"对于ArrowApply?

时间:2014-11-24 16:37:49

标签: haskell arrows

"Programming with Arrows",Hughes断言

  

首先,请注意,第一个和第二个都很容易实现   应用程序(详细信息留作练习)。

从Control.Arrow,left可以实现为:

leftApp :: ArrowApply a => a b c -> a (Either b d) (Either c d)
leftApp f = arr ((\b -> (arr (\() -> b) >>> f >>> arr Left, ())) |||
                 (\d -> (arr (\() -> d) >>> arr Right, ()))) >>> app

如何仅使用firstarr>>>实施app

1 个答案:

答案 0 :(得分:1)

我想我明白了,但如果有更简单的解决方案,我会非常感兴趣

firstApp :: ArrowApply cat => cat t t1 -> cat (t, t2) (t1, t2)
firstApp f = arr (\(x, y) -> (arr (\() -> (f, x))) >>>
                             app >>>
                             (arr (\v -> (v, y)))) >>>
             arr (\v -> (v, ())) >>>
             app