好的,所以我想到了带箭头的乐趣.我试图直接将性感的Haskell quicksort转换为使用箭头的实现.但它无法正常工作.
import Control.Arrow
qs :: Ord a => [a] -> [a]
qs = isEmpty >>> right (head &&& tail
>>> first ((qs.) . filter . (<)
&&& (\x -> (x:) . qs . filter (>=x)))
>>> first (uncurry (&&&))
>>> uncurry id
>>> uncurry (++))
>>> extract
where
isEmpty [] = Left []
isEmpty x = Right x
extract (Left x) = x
extract (Right x) = x
Run Code Online (Sandbox Code Playgroud)
有人能发现问题吗?
第一个过滤器的谓词不正确.
(qs.) . filter . (<)
Run Code Online (Sandbox Code Playgroud)
应该
(qs.) . filter . (>)
Run Code Online (Sandbox Code Playgroud)
问题是你没有真正拆分tail,两个比较不是互补的.当我们将第一个作为lambda编写时,它变得显而易见:
first ( (\x -> qs. . filter (x<))
&&& (\x -> (x:) . qs . filter (>=x)) )
Run Code Online (Sandbox Code Playgroud)
什么时候你想要的很明显
first ( (\x -> qs. . filter (<x))
&&& (\x -> (x:) . qs . filter (>=x)) )
Run Code Online (Sandbox Code Playgroud)
要么
first ( (qs.) . filter . (>)
&&& (\x -> (x:) . qs . filter (x<=)) )
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我宁愿app过uncurry id.