2016-06-23 10 views
-3

Ich muss Code implementieren, um einige Tests abzudecken, aber ich stehe mit einigen kleinen Problemen fest.Haskell fmap foldr für algebraische Datenstrukturen

Die Logik für Foldr-Funktionen scheint korrekt zu sein, aber ich bekomme einen Fehler beim Kompilieren.

Dieser Fehler bedeutet, dass mein Code einige Fälle für foldr-Funktionen nicht abdeckt.

Der Code ist unten angegeben:

module QueueFunctor where 

import Test.HUnit (runTestTT,Test(TestLabel,TestList,TestCase),(~?=)) 
import Data.Char (toUpper) 
import Prelude hiding (foldr) 
import Data.Foldable (Foldable, foldr) 

data DQueue a = Empty | Enqueue a (DQueue a) 
    deriving (Eq, Show, Read) 



instance Functor DQueue 
     where 
     fmap f (Enqueue x xs) = (length xs == 0) then Empty else Enqueue (f x) $ fmap f xs 

instance Foldable DQueue 
    where 
    foldr f result (Enqueue x xs) = if (length xs == 0) then f result Empty else foldr f (f x result) xs 


-- | Tests a few examples. 
main :: IO() 
main = do 
    testresults <- runTestTT tests 
    print testresults 


sample1 :: DQueue Int 
sample1 = Enqueue 1 $ Enqueue 2 $ Enqueue 3 $ Enqueue 4 Empty 

sample2 :: DQueue String 
sample2 = Enqueue "a" $ Enqueue "b" $ Enqueue "c" $ Enqueue "d" Empty 

sample3 :: DQueue [Int] 
sample3 = Enqueue [1,2,3] $ Enqueue [4,5,6] Empty 

tests :: Test 
tests = TestLabel "DQueueTest" (TestList [ 
     fmap (+1) sample1 ~?= Enqueue 2 (Enqueue 3 (Enqueue 4 (Enqueue 5 Empty))), 
     fmap (map toUpper) sample2 ~?= Enqueue "A" (Enqueue "B" (Enqueue "C" (Enqueue "D" Empty))), 
     fmap (length) sample3 ~?= Enqueue 3 (Enqueue 3 Empty), 
     foldr (+) 0 sample1 ~?= 10, 
     foldr (++) "" sample2 ~?= "abcd", 
     foldr (\a b ->(+) b (length a)) 0 sample3 ~?= 6 
    ]) 

Danke im Voraus

+3

Mögliches Duplikat von [Haskell fmap funktor] (http://stackoverflow.com/questions/37987890/haskell-fmap-functor) - Sie haben diese Frage vor ein paar Stunden gestellt. –

+2

Bitte ändern Sie die Frage nicht, nachdem Sie eine Antwort mit einer aktualisierten Fehlermeldung erhalten haben. Es wäre am besten, eine neue Frage zu beginnen. So wie es aussieht, sieht die aktuelle Antwort so aus, als ob sie die Frage nie lesen würden. –

+0

Okay, ich werde ein neues erstellen. Es tut uns leid. –

Antwort

2

Beide Instanz Erklärungen für Foldable und Functor Muster fehlen, die den Empty Konstruktor entsprechen.

Sie müssen Code hinzufügen für

foldr f result Empty = ... 
-- and ... 
fmap f Empty = ... 

Nichterschöpfende bedeutet, dass es Muster gibt, die nicht angepasst sind, die Ihr Programm verursachen kann zum Absturz bringen.

+0

Hm, Sie haben recht, es hat das Problem mit fmap gelöst, aber nicht mit foldr. –

+0

Werfen Sie einen Blick auf [wie 'Maybe' implementiert' foldr' für den 'Nothing'-Konstruktor] (http://hackage.haskell.org/package/base-4.9.0.0/docs/src/Data.Foldable.html) . Ihre Implementierung wird wahrscheinlich ähnlich aussehen. –