0

どういうわけか、私はまだ 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

明らかに、この関数は type の「ベクトル」に対する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が、データ型には必要な構造がありません。

そのような「リフティング」を行うことができない根本的な理由はありますか?

4

0 に答える 0