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