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

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

4

2 に答える 2

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

于 2013-04-06T10:56:34.547 に答える