Mai*_*r00 17 haskell functional-programming functor category-theory
在Haskell中学习仿函数时,我想出了Functor.Indexed类型的仿函数.该仿函数定义了一个名为的操作imap
.我不理解它的定义和imap
签名:imap :: (a -> b) -> f j k a -> f j k b
.我试图找到它的正式定义,只发现了这个:http://ncatlab.org/nlab/show/indexed+functor.但它根本没有帮助我.那么有人可以用更简单的词语澄清这种仿函数以及在什么情况下我应该使用它?谢谢.
lef*_*out 19
索引编写器是使用spaceuitburritoesque措辞,"也包含映射的容器".即一个值f j k a
将"包含"某种态射(j -> k
不一定是函数,可以是更一般的箭头)以及类型的值a
.
对于这些a
值,容器是一种显而易见的仿函数.事实上,这IxFunctor
门课本身很无聊 - 一个
instance IxFunctor f
Run Code Online (Sandbox Code Playgroud)
基本上是一样的
instance Functor (f j k)
Run Code Online (Sandbox Code Playgroud)
现在,它变得有趣的地方是你考虑更具体的仿函数类.这个monad实际上并不在Indexed
模块中,但我认为这一点最清楚:
class IxPointed f => IxMonad f where
ijoin :: m j k (m k l a) -> m j l a
Run Code Online (Sandbox Code Playgroud)
比较这并排:
(>>>) :: (j->k) -> (k->l) -> j->l
ijoin :: m j k (m k l a) -> m j l a
join :: m (m a) -> m a
Run Code Online (Sandbox Code Playgroud)
所以我们所做的是,在加入"容器层"时,我们构成了态射.
明显的例子是IxState
.回想一下标准的状态monad
newtype State s a = State { runState :: s -> (a, s) }
Run Code Online (Sandbox Code Playgroud)
当用作monad时,它只是组成s -> s
函数的方面:
join (State f) = State $ \s -> let (State f', s') = f s in f' s'
Run Code Online (Sandbox Code Playgroud)
所以你首先通过状态f
,然后通过f'
.嗯,我们真的没有理由要求所有州拥有相同的类型,对吗?毕竟,中间状态只是传递给下一个动作.这是索引状态monad,
newtype IxState i j a = IxState { runIxState :: i -> (a, j) }
Run Code Online (Sandbox Code Playgroud)
它就是这样的:
ijoin (IxState f) = IxState $ \s -> let (IxState f', s') = f s in f' s'
Run Code Online (Sandbox Code Playgroud)