如何为这种类型编写 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
仿函数的用例。
我正在为 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
仿函数的用例。