使用Arrows实现快速排序有什么问题?

has*_*ine 11 haskell arrows

好的,所以我想到了带箭头的乐趣.我试图直接将性感的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)

有人能发现问题吗?

sna*_*nak 6

第一个过滤器的谓词不正确.

(qs.) . filter . (<)
Run Code Online (Sandbox Code Playgroud)

应该

(qs.) . filter . (>)
Run Code Online (Sandbox Code Playgroud)


lef*_*out 6

问题是你没有真正拆分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)

顺便说一句,我宁愿appuncurry id.