2013-04-06 4 views
11

よかったので、私は矢印で楽しいことを考えました。私は、セクシーなHaskellクイックソートを矢印を使用する実装に直接変換しようとしました。しかし、正しく動作しません。矢印を使用したクイックソートの実装で何が問題になっていますか?

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 

誰かが問題を見つけることができますか?

答えて

6

あるべき問題は、あなたが本当にtailを分割していないということである、2つの比較は補完ではありません。私たちはラムダとして最初のものを書くとき、それはあまりにも、明らかになった:

first ((\x -> qs. . filter (x<)) 
    &&& (\x -> (x:) . qs . filter (>=x))) 

何がしたいことは、明らかに

first ((\x -> qs. . filter (<x)) 
    &&& (\x -> (x:) . qs . filter (>=x))) 

または

first ((qs.) . filter . (>) 
    &&& (\x -> (x:) . qs . filter (x<=))) 

ときにところで、私はappを好みますuncurry id以上。

+0

素晴らしい! 'app'について知ることは良いことです。ありがとう:) – haskelline

6

最初のフィルタの述語が正しくありません。

(qs.) . filter . (<) 

(qs.) . filter . (>) 
関連する問題