不知何故,我仍然试图建立一种关于我能在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
中的态射集,但我的数据类型缺乏必要的结构。
是否有可能无法做到这一点的根本原因"解除"?