[英]Haskell fmap functor
我有一个基于指定代数数据结构的函子在队列上的问题。
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
结果应该是这样的:
fmap (+1) sample1 ~?= Enqueue 6 (Enqueue 8 (Enqueue 10 Empty))
foldr (+) 0 sample1 ~?= 24
fmap似乎在逻辑上是正确的,但出现错误:函数fmap中的非穷尽模式
先感谢您。
您的Functor
实例定义不是穷尽的,因为它不能处理DQueue
所有可能的类型构造DQueue
。 即,它缺少匹配Empty
的模式。 您需要定义当值为Empty
时如何处理fmap
。
该错误说明了Functor
:您对Functor
的定义定义为:
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
但是,有可能(在这种情况下,如果我正确理解了您的数据结构,可以确定)最终fmap
将被送入Empty
实例。 因此,您必须将定义扩展为:
instance Functor DQueue where fmap f (Enqueue x xs) = Enqueue (f x) $ fmap f xs fmap _ Empty = Empty
大多数编译器都支持标志,以使编译器抱怨非穷尽模式,对于Glasgow Haskell编译器 ( ghc
),可以使用-fwarn-incomplete-patterns
标志。 例如:
$ ghc queue.hs -fwarn-incomplete-patterns
[1 of 1] Compiling Main ( queue.hs, queue.o )
queue.hs:7:5: Warning:
Pattern match(es) are non-exhaustive
In an equation for ‘fmap’: Patterns not matched: _ Empty
Linking queue ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.