2016-06-23 2 views
-3

Мне нужно реализовать код, чтобы покрыть несколько тестов, но у меня есть несколько небольших проблем.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 
    ]) 

Спасибо заранее

+3

Возможный дубликат [Haskell fmap functor] (http://stackoverflow.com/questions/37987890/haskell-fmap-functor) - Вы задали этот вопрос пару часов назад. –

+2

Пожалуйста, не изменяйте вопрос после того, как вы получили ответ с обновленным сообщением об ошибке. Было бы лучше начать новый вопрос. Как бы то ни было, в текущем ответе создается впечатление, что они даже не читали вопрос. –

+0

Хорошо, я создам новый. Сожалею. –

ответ

2

Оба экземпляра заявления на Foldable и Functor отсутствуют шаблоны, которые соответствуют Empty конструктора.

Вам нужно добавить код для

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

Неполный означает, что есть образцы, которые не имеют аналогов, которые могут привести к вашей программе сбой.

+0

Хм вы правы, он решил проблему с fmap, но не с foldr. –

+0

Взгляните на [как 'Maybe' реализует' foldr' для конструктора 'Nothing' (http://hackage.haskell.org/package/base-4.9.0.0/docs/src/Data.Foldable.html) , Вероятно, ваша реализация будет похожей. –

Смежные вопросы