为了熟悉像Foldable、Functor等伟大的想法,我正在编写一个二维矩阵的数据结构。虽然它并不是真正的使用,但我认为这个天真的实现是一个不错的开始:
data Matrix2d a = M2 a a a a
我希望这是一个
Num
实例。instance Num a => Num (Matrix2d a) where
(M2 a0 b0 c0 d0) + (M2 a1 b1 c1 d1) = M2 (a0+a1) (b0+b1) (c0+c1) (d0+d1)
-- ....
这似乎不太对。我不想为这个显然的定义输入五次“+”。肯定有更多的抽象空间。我更喜欢像这样的东西
(+) = fzipWith (+) -- f does not mean anything here
这实际上很容易实现:
class Zippable z where
fzipWith :: (a -> b -> c) -> z a -> z b -> z c
instance Zippable Matrix2 where
fzipWith f (M2 x y z w) (M2 a b c d) = M2 (f x a) (f y b) (f z c) (f w d)
然而,我在hoogle中找不到任何现成的内容。我觉得这很奇怪,因为这种抽象似乎很自然。有Foldable
,有Functor
——为什么没有Zippable
呢?
问题:
- 是否有任何模块提供此功能?
- 如果没有(我相信是这种情况),我有哪些选择?定义自己的类是最好的选择,还是有更好的选择?
(+)
这样的函数提供了非常规则的结构。 - luqui