2013-04-06 17 views
11

Tamam, oklarla biraz eğlenmeyi düşündüm. Seksi Haskell quicksort'unu doğrudan okları kullanan bir uygulamaya çevirmeyi denedim. Ancak doğru çalışmıyor.Bu Quicksort uygulamasının Oklar kullanılarak gerçekleştirilmesinin nesi yanlış?

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 

Sorun görüyor musunuz?

cevap

6

sorun gerçekten tail bölmek kalmamasıdır olmalıdır.

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

ne istediğini açıkça

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

veya BTW

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

olduğunda ben app tercih ediyorum,: Biz de bir lambda olarak ilkini, yazarken Belli olur uncurry id üzerinde.

+0

Harika! App hakkında bilmek güzel. Teşekkürler :) – haskelline

6

İlk filtrenin yüklemi yanlış.

(qs.) . filter . (<) 

iki karşılaştırmalar tamamlayıcı değildir,

(qs.) . filter . (>) 
İlgili konular