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?
是的,如果不是自然的话,这是可能的.
为了满足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括住的自然数,然后使用的定义bindRep和pureRep我表示的,函子包自动获取的定义.