[英]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
。 即使忽略函数f
, K
的第二种类型也会根据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.