Monad实例的数字参数化矢量?

use*_*370 4 monads haskell types

Haskell中的静态大小的向量显示在Oleg Kiselyov的Number-parameterized类型中,也可以在Hackage上Data.Param.FSVec参数化数据模块的类型中找到:

data Nat s => FSVec s a
Run Code Online (Sandbox Code Playgroud)

FSVec不是Monad类型类的实例.

列表的monad实例可用于删除或复制元素:

Prelude> [1,2,3] >>= \i -> case i of 1 -> [1,1]; 2 -> []; _ -> [i]
[1,1,3]
Run Code Online (Sandbox Code Playgroud)

无论是否与列表版本相似,是否可以从固定长度向量构造monad?

Edw*_*ETT 7

是的,如果不是自然的话,这是可能的.

为了满足monad定律,monad必须"对齐"结果.

也就是说,您可以将向量视为表格函数[0..n-1] -> a,然后使monad实例适应函数.

得到的join运算采用矢量矢量形式的方阵,并返回其对角线.

特定

tabulate :: Pos n => (forall m. (Nat m, m :<: n) => m -> a) -> FSVec n a
Run Code Online (Sandbox Code Playgroud)

然后

instance Pos n => Monad (FSVec n) where
     return = copy (toNum undefined)
     v >>= f = tabulate (\i -> f (v ! i) ! i)
Run Code Online (Sandbox Code Playgroud)

可悲的是使用这个单子是比较有限的.

我的溪流包中有六个关于主题的变化,Jeremy Gibbons 在这个monad上写了一篇博文.

同样地,您可以查看FSVec n作为可表示函子,其代表是由n括住的自然数,然后使用的定义bindReppureRep表示的,函子包自动获取的定义.

  • 可表示的仿函数(当翻译成Haskell时)的想法是仿函数`f`与来自某种类型`x`的函数同构.我们通常称这种类型为"x"以及同构,即`f`的表示.`representable-functors`见证了这两个函数的同构:`tabulate ::(x - > a) - > fa`和`index :: fa - >(x - > a)`.任何一个例子都是由`数据对a =对aa`给出的Functor,可由`Bool`表示.在这种情况下`tabulate f = Pair(f False)(f True);`和`index(Pair _ f)False = f; index(Pair t _)True = t`. (2认同)