繁体   English   中英

如何为这种类型编写 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 ab ,我什至不明白如何开始,例如如何继续fmap f Flip ...

我想也许在这样做之前我还应该为 newtype K ab编写一个函子,类似于我所做的data K ab

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

但我无法理解如何处理Flip fab的 Functor 实例。

任何想法,提示?

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

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

Flip (K a)实际上是什么意思?

K是常数函子,您正确实现了它。 它忽略函数f并始终返回K a 但在幕后实际发生的是值K ab转换为K ac 即使忽略函数fK的第二种类型也会根据f的类型发生变化。

现在,如果我们Flip K ,我们只需扭转论点:

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))

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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