我可以将 Haskell 中的自然转换定义为:
h :: [a] -> Maybe a
h [] = Nothing
h (x:_) = Just x
并带有函数 k:
k :: Char -> Int
k = ord
由于以下事实,满足自然条件:
h . fmap k
==fmap k . h
List monadjoin
函数的自然性条件可以用类似的方式证明吗?我很难理解如何join
,concat
特别是,是一种自然的转变。
我可以将 Haskell 中的自然转换定义为:
h :: [a] -> Maybe a
h [] = Nothing
h (x:_) = Just x
并带有函数 k:
k :: Char -> Int
k = ord
由于以下事实,满足自然条件:
h . fmap k
==fmap k . h
List monadjoin
函数的自然性条件可以用类似的方式证明吗?我很难理解如何join
,concat
特别是,是一种自然的转变。
好的,我们来看看concat
。
首先,这是实现:
concat :: [[a]] -> [a]
concat = foldr (++) []
这类似于h
where的结构Maybe
被替换为[]
,更重要的是,[]
被替换为--to abuse syntax for a moment-- [[]]
。
[[]]
当然,它也是一个仿函数,但它不是自然条件使用它的方式的一个Functor
实例。直接翻译你的例子是行不通的:
concat . fmap k
=/=fmap k . concat
...因为两个fmap
s 都只在最外层工作[]
。
尽管[[]]
假设是一个有效的实例,Functor
但您不能直接将其设为一个,但出于可能显而易见的实际原因。
但是,您可以这样重建正确的提升:
concat . (fmap . fmap) k
==fmap k . concat
...wherefmap . fmap
等效于fmap
for 的假设Functor
实例 for的实现[[]]
。
作为相关的附录,return
由于相反的原因很尴尬:a -> f a
是从省略的恒等函子的自然转换。使用: []
身份将这样写:
(:[]) . ($) k
==fmap k . (:[])
...完全多余($)
的东西代替fmap
了省略的身份函子。