本文介绍了Haskell fmap函子的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
基于指定的代数数据结构,我在函数队列上遇到了问题。
数据DQueue a =空|排队a(DQueue a)
派生(Eq,Show,Read)
实例Functor DQueue
其中
fmap f(Enqueue x xs)= Enqueue(fx)$ fmap f xs
实例可折叠DQueue
其中
foldr =错误未完成
sample1 :: DQueue Int
sample1 = Enqueue 5 $ Enqueue 7 $ Enqueue 9 Empty
结果应该如下所示:+>
fmap(+1)sample1〜?= Enqueue 6(Enqueue 8(Enqueue 10 Empty))
foldr(+ )0 sample1〜?= 24
fmap似乎是逻辑正确的,但我得到一个错误:
函数fmap中的非详尽模式
预先感谢您。
解决方案
您的 Functor
实例定义并非详尽无遗,因为它不处理 DQueue
所有可能的类型构造函数。 。也就是说,它缺少一个匹配空
的模式。当您的值为空
时,您需要定义如何处理 fmap
。
I have a problem with functors over queue based on designated algebraic datastructures.
data DQueue a = Empty | Enqueue a (DQueue a)
deriving (Eq, Show, Read)
instance Functor DQueue
where
fmap f (Enqueue x xs) = Enqueue (f x) $ fmap f xs
instance Foldable DQueue
where
foldr = error "not done"
sample1 :: DQueue Int
sample1 = Enqueue 5 $ Enqueue 7 $ Enqueue 9 Empty
and result should be like that:
fmap (+1) sample1 ~?= Enqueue 6 (Enqueue 8 (Enqueue 10 Empty))
foldr (+) 0 sample1 ~?= 24
fmap seems to be logicaly correct but I get an error:Non-exhaustive patterns in function fmap
Thank you in advance.
解决方案
Your Functor
instance definition is non-exhaustive because it doesn't handle all possible type constructors of DQueue
. Namely, it is missing a pattern matching Empty
. You need to define how to handle fmap
when your value is Empty
.
这篇关于Haskell fmap函子的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!