考虑以下包装器:
newtype F a = Wrap { unwrap :: Int }
我想反驳(作为围绕这个有趣帖子的练习)存在一个合法Functor F
实例,它允许我们将Int -> Int
类型函数应用于实际内容并〜忽略〜所有其他函数(即fmap nonIntInt = id
)。
我相信这应该用一个自由定理来完成(我在这里fmap
读到): 对于给定的 ,和,这样: ,给定构造函数的自然映射在哪里。f
g
h
k
g . f = k . h
$map g . fmap f = fmap k . $map h
$map
什么定义了自然地图?我是否正确地假设它是一个简单flip const
的 for F
?
据我所知:$map f
是我们Ff
在范畴论中所指的。因此,从分类的意义上说,我们只是想要下图中的一些东西来通勤:
然而,我不知道用什么代替???
s (也就是说,我们应用什么函子来得到这样的图,我们如何表示这个几乎fmap
-?)。
那么,一般来说,什么是自然地图F
?的自由定理的正确图是什么fmap
?
我要去哪里?
考虑:
f = const 42
g = id
h = const ()
k () = 42
很容易看出f . g
是h . k
。然而,不存在的fmap
只会执行,而f
不是k
,给出不同的结果。如果我对自然性的直觉是正确的,那么这样的证明就会奏效。这就是我想要弄清楚的。
@leftaroundabout提出了一个更简单的证明:fmap show . fmap (+1)
改变内容,不像fmap $ show . (+1)
. 这是一个很好的证明,但我仍然想将自由定理作为练习。