2016-06-23 8 views
1

Ich habe alle Probleme gelöst, die ich mit Funktionen hatte, aber eine bleibt übrig.Haskell foldr algrebraic datatypes

Die foldr Funktion arbeitet vom letzten Elemente zum ersten und ich brauche die Daten in der anderen Reihenfolge

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 Foldable DQueue 
    where 
    foldr _ result Empty = result 
    foldr f result (Enqueue x xs) = 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 

tests :: Test 
tests = TestLabel "DQueueTest" (TestList [ 
     foldr (++) "" sample2 ~?= "abcd" 
    ]) 

zu bekommen Wenn ich das Programm zu kompilieren, ich einen Fehler in Bezug auf Tests erhalten:

### Failure in: DQueueTest:1 
QueueFunctors.hs:56 
expected: "abcd" 
but got: "dcba" 

Vielen Dank im Voraus.

+0

Warum nicht 'foldl' verwenden? – karakfa

+0

Es gab eine strenge Regel in der Beschreibung der Aufgabe, um foldr zu verwenden. –

+2

Ihre 'foldr' Definition sieht aus, als wäre sie' foldl'. Das würde die umgekehrten Ergebnisse erklären. – melpomene

Antwort

2

Betrachten Sie diese Definition von foldr für Listen, die für die Listeninstanz Foldable verwendet wird.

foldr   :: (a -> b -> b) -> b -> [a] -> b 
foldr _ z []  = z 
foldr f z (x:xs) = f x (foldr f z xs) 

Betrachten Sie nun, dass Ihr Datentyp isomorph zu einer Liste ist.

data DQueue a = Empty | Enqueue a (DQueue a) 

toList :: Dqueue a -> [a] 
toList Empty = [] 
toList (Enqueue x xs) = x : toList xs 

fromList :: [a] -> Dqueue a 
fromList [] = Empty 
fromList (x:xs) = Enqueue x (fromList xs) 
+0

Ich habe es, danke! –