2016-08-04 24 views
0

ich nicht erschöpfende Muster Ausnahme für den folgenden CodeHaskell: Nicht erschöpfende Muster in Funktion

--determine which list is longer 
longer::[a]->[a]->Bool 
longer [] [] = False 
longer _ [] = True 
longer (_:[]) (_:[]) = False 
longer (_:xs) (_:ys) = longer xs ys 

Ich verstehe nicht, was ich falsch hier tue.

+3

Verwenden: 'ghc -Wall prog.hs 'und ghc sollten Ihnen die Muster erklären, die nicht berücksichtigt werden. – ErikR

Antwort

4

Du diesen Fall nicht Handhabung:

longer [] _ = undefined 

Das Muster (_:[]) geht davon aus, dass Sie mindestens ein Element in der Liste haben. In Ihrem Code fehlt der Fall, wenn die erste Liste leer ist und die zweite Liste möglicherweise nicht leer ist.

+0

Oder sollte es vielleicht länger sein als _ = Falsch? – zigazou

+1

Ich verlasse das für das OP. :) – Sibi

2

Sie benötigen 4 Fälle, aber Sie müssen nicht zwei Singleton-Listen als separaten Fall behandeln.

longer :: [a] -> [a] -> Bool 

-- 1) Two empty lists 
longer [] [] = False 
-- 2) An non-empty list and an empty list 
longer _ [] = True 
-- 3) An empty list and a non-empty list 
longer [] _ = ??? 
-- 4) Two non-empty lists 
longer (_:xs) (_:ys) = longer xs ys 

Eigentlich müssen Sie nur 3 Fälle in der richtigen Reihenfolge, je nachdem, was longer [] _ sein sollte.

-- First case: if longer [] _ is suppose to be True 
longer :: [a] -> [a] -> Bool 
longer [] [] = True 
longer (_:xs) (_:ys) = longer xs ys 
-- We get this far if one is empty and the other is not, 
-- but we don't care which one is which. 
longer _ _ = False 

-- Second case: if longer [] _ is supposed to be False 
longer :: [a] -> [a] -> Bool 
longer (_:xs) (_:ys) = longer xs ys 
longer _ [] = True 
longer [] _ = False -- This covers longer [] [] as well.