3

だから私はこの関数を持っています、そして私がそれをこのように使おうとすると:mergeSortedLists [1,1] [1,1]それは私にエラーを与えます:

[1,1 ***例外:SortFunctions.hs:(86,1)-(91,89):関数mergeSortedListsの非網羅的なパターン

85 mergeSortedLists :: (Ord t)       => [t] -> [t] -> [t]
86 mergeSortedLists [] []            = []
87 mergeSortedLists (x:[]) []        = x:[]
88 mergeSortedLists [] (y:[])        = y:[] 
89 mergeSortedLists (x:[]) (y:[])    = (max x y) : (min x y) : []
90 mergeSortedLists (x:tail1) (y:tail2) | x > y  = x : (mergeSortedLists tail1     (y:tail2))
91                                      | otherwise = y : (mergeSortedLists (x:tail1) tail2)

私は可能な限りすべてのケースをカバーしたと思うので、問題の原因を理解することはできません。ここで何が問題になる可能性がありますか?

4

1 に答える 1

9

2番目と3番目のケースのパターンは、空のリストとマージされた長さ1のリストをカバーしていますが、空のリストとマージされたより長いリストはカバーしていません。つまり、次のようなケースはカバーしていません。

mergeSortedLists [3, 2, 1] []
mergeSortedLists [] [3, 2, 1]

これは、あなたがやろうとしていると思うことをより少ないケースで実行する関数です。

mergeSortedLists :: (Ord t) => [t] -> [t] -> [t]
mergeSortedLists x [] = x
mergeSortedLists [] y = y
mergeSortedLists (x:tail1) (y:tail2)
    | x > y     = x : (mergeSortedLists tail1 (y:tail2))
    | otherwise = y : (mergeSortedLists (x:tail1) tail2)

(また、あなたの関数は技術的に逆ソートされたリストをマージしていませんか?)

于 2012-07-23T14:58:28.143 に答える