本文介绍了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函子的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-18 07:25