休斯的箭头过滤器练习

时间:2013-04-15 12:45:51

标签: haskell

我一直在阅读John Hughes的“箭头编程”,我首先要练习,他要求读者为箭头filterA实现一般的过滤功能。规范说它应该像过滤(>)箭头和过滤器在Kliesli箭头上的行为。我尝试按如下方式实现它,但我最终得到的结果似乎比我在网上看到的其他解决方案简单得多。我担心我错过了一些东西,但我的答案似乎与规范所暗示的一样。它匹配过滤器 - >和过滤器M用于Kliesli箭头。它也适用于流函数。

listcase [] = Left ()
listcase (x:xs) = Right (x,xs)


filterA :: forall a arr. ArrowChoice arr => arr a Bool -> arr [a] [a]
filterA f = arr listcase >>>
            arr (const []) ||| (switchA *** filterA f >>> arr (uncurry (++)))
                where switchA :: ArrowChoice arr => arr a [a]
                      switchA = (f &&& id) >>> arr (\(b,x) -> if b then [x] else [])

这是可接受的实施吗?

1 个答案:

答案 0 :(得分:3)

我似乎可以接受。作为替代方案,您可以考虑使用uncurry ($)

switchA :: ArrowChoice arr =>> arr a ([a] -> [a])
switchA = (f &&& arr id) >>> arr test
  where
    test (False, _) = id
    test (True, x)  = (x :)