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
Mögliches Duplikat von [Haskell fmap funktor] (http://stackoverflow.com/questions/37987890/haskell-fmap-functor) - Sie haben diese Frage vor ein paar Stunden gestellt. –
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. –
Okay, ich werde ein neues erstellen. Es tut uns leid. –