【问题标题】:How to write the Functor instance for this type?如何为这种类型编写 Functor 实例?
【发布时间】:2016-10-10 17:25:16
【问题描述】:

我正在努力完成Haskell Book 的练习(第 16 章。函子)。鉴于以下情况,它希望我定义fmap

{-# LANGUAGE FlexibleInstances #-}

newtype Flip f a b = 
   Flip (f b a) 
   deriving (Eq, Show)

newtype K a b = 
  K a

instance Functor (Flip K a) where
   fmap = undefined

在之前的练习中,我已经完成了以下操作:

 data K a b =
   K a

 instance Functor (K a) where
   fmap f (K x) = K x

但是对于这个Flip a b,我什至无法理解如何开始,例如如何继续fmap f Flip ...

我想也许在这样做之前我还应该为新类型 K a b 编写一个仿函数,类似于我所做的 data K a b

instance Functor (K a) where
  fmap f (K x) = K x

但我不明白如何继续使用 Flip f a b 的 Functor 实例。

任何想法,提示?

【问题讨论】:

  • 最后我想出了一些类型检查的东西:instance Functor (Flip K a) where fmap f (Flip (K x)) = Flip (K (f x))。但现在我无法向自己解释(甚至不知道它是否正确)。

标签: haskell functor


【解决方案1】:

让我们看看你的解决方案:

instance Functor (Flip K a) where
  fmap f (Flip (K a)) = Flip (K (f b))

Flip (K a) 究竟是什么意思?

K 是您正确实现的常量函子。它忽略函数f 并始终返回K a。但在幕后实际发生的是值K a b 转换为K a c。尽管f这个函数被忽略了,但是K的第二种类型会根据f的类型而改变。

现在如果我们FlipK,我们只需将论点转过来:

Flip (K a b) == K b a

我们有一个不断变化的值和一个常量“忽略”类型,而不是一个常量值并忽略函数。查看具有显式类型签名的实现,我们得到:

instance Functor (Flip K a) where
  fmap :: (b -> c) -> Flip K a b -> Flip K a c -- or:
  fmap :: (b -> c) -> K b a -> K c a
  fmap f (Flip (K a)) = Flip (K (f b))

正如您已经得出的结论,唯一可能的实现是上面的那个。

您实际上可以在this 问题中看到Constant 函子的用例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    相关资源
    最近更新 更多