19

我可以将 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函数的自然性条件可以用类似的方式证明吗?我很难理解如何joinconcat特别是,是一种自然的转变。

4

1 回答 1

16

好的,我们来看看concat

首先,这是实现:

concat :: [[a]] -> [a]
concat = foldr (++) []

这类似于hwhere的结构Maybe被替换为[],更重要的是,[]被替换为--to abuse syntax for a moment-- [[]]

[[]]当然,它也是一个仿函数,但它不是自然条件使用它的方式的一个Functor实例。直接翻译你的例子是行不通的:

concat . fmap k=/=fmap k . concat

...因为两个fmaps 都只在最外层工作[]

尽管[[]]假设是一个有效的实例,Functor但您不能直接将其设为一个,但出于可能显而易见的实际原因。

但是,您可以这样重建正确的提升:

concat . (fmap . fmap) k==fmap k . concat

...wherefmap . fmap等效于fmapfor 的假设Functor实例 for的实现[[]]

作为相关的附录,return由于相反的原因很尴尬:a -> f a是从省略的恒等函子的自然转换。使用: []身份将这样写:

(:[]) . ($) k==fmap k . (:[])

...完全多余($)的东西代替fmap了省略的身份函子。

于 2011-05-08T23:53:55.397 回答