在"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
如何仅使用first
,arr
和>>>
实施app
?
答案 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