繁体   English   中英

Haskell fmap函子

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM