Мне нужно реализовать код, чтобы покрыть несколько тестов, но у меня есть несколько небольших проблем.Haskell fmap foldr для алгебраических datastructures
Логика для функций foldr кажется правильной, но во время компиляции я получаю сообщение об ошибке.
Эта ошибка означает, что мой код не охватывает некоторые случаи для функций foldr.
код приведен ниже:
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
])
Спасибо заранее
Возможный дубликат [Haskell fmap functor] (http://stackoverflow.com/questions/37987890/haskell-fmap-functor) - Вы задали этот вопрос пару часов назад. –
Пожалуйста, не изменяйте вопрос после того, как вы получили ответ с обновленным сообщением об ошибке. Было бы лучше начать новый вопрос. Как бы то ни было, в текущем ответе создается впечатление, что они даже не читали вопрос. –
Хорошо, я создам новый. Сожалею. –