什么是Haskell中的索引函数及其用法是什么?

时间:2015-01-04 23:23:28

标签: 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。但它根本没有帮助我。那么有人可以用更简单的词语澄清这种仿函数以及在什么情况下我应该使用它?感谢。

1 个答案:

答案 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

当用作mo​​nad时,只需编写函数的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) }