哈斯克尔:"提升"函数

时间:2016-05-04 22:15:12

标签: haskell types functor lifting

不知何故,我仍然试图建立一种关于我能在Haskell中表达什么以及什么不能表达的直觉。

我有自己的(简单)矩阵类型,我想知道是否有可能以某种方式提升"提升"它是一个函数,以便理解应用于矢量的矩阵的通常数学符号。

让我更详细地解释这个问题。

data Matrix a = M [[a]] deriving (Show,...)

dot u v = foldr (+) 0 $ zipWith (*) u v

mv :: Num a => Matrix a -> [a] -> [a]
mv (M []) _ = []
mv _ [] = []
mv (M m) v = dot (head m) v : mv (M (tail m)) v

显然,函数mv在"向量"上实现矩阵M m的动作。类型为[a]

但是,有没有办法用(M' m) v这样的语法实现相同的操作

(M' m) v = mv (M m ) v ?

然后应该允许编写类似

的内容
m = M' [[2,3],[5,7]]
v = m [1,0] -- v == [2,5]

我怀疑我定义的矩阵数据类型不足以进行这样的提升。不知怎的,我想我试图从一个自定义矩阵类型到一些hom([a],[a])找到一个仿函数,即矢量空间类Vec中的态射集,但我的数据类型缺乏必要的结构。

是否有可能无法做到这一点的根本原因"解除"?

0 个答案:

没有答案