如何为这种类型编写 Functor 实例?

How to write the Functor instance for this type?

我正在为 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 a)) = Flip (K (f b))

Flip (K a) 到底是什么意思?

K 是常量仿函数,您正确实现了它。它忽略函数 f 并且总是 returns K a。但实际上在幕后发生的是值 K a b 被转换为 K a c。尽管函数 f 被忽略了,但第二种类型 K 根据 f 的类型发生了变化。

现在如果我们 Flip K,我们只需简单地转换参数:

Flip (K a b) == K b a

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

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 仿函数的用例。