4
我是相當新的Haskell和不理解下面分而治之的結構:分而治之:合併排序
{- trivial solve split combine input/output-}
dc :: (a -> Bool) -> (a -> b) -> (a -> [a]) -> ([b] -> b) -> a -> b
dc trivial solve split combine = x
where
x y = if trivial y then solve y
else (\_ z -> combine z) y (map x (split y))
現在我需要實現在此基礎上構建一個合併排序功能。我試圖實現一些功能,但我很確定這不是它應該如何工作:
trivial :: (Ord a, Num a) => [a] -> Bool
trivial [] = True
trivial (x:[]) = True
trivial (x:x':xs) = if x<=x' then trivial (x':xs) else False
split :: [a] -> [[a]]
split (x:[]) = [[x]]
split (x:xs) = [x] : split xs
combine :: [[a]] -> [a]
combine [[]] = []
combine ([]:ys) = combine ys
combine ((x:xs):ys) = x : combine (xs:ys)
那麼上述構造如何工作? 「x」和「y」代表什麼? 「微不足道」和「解決」(以及分裂/合併)應該做什麼?