我想知道是否有可能编写一个Haskell加法运算符,它可以用于两个数字、两个数字列表、两个数字矩阵等等。也就是说,是否有可能定义一个<+>
,使得以下所有内容都能正常工作:
1 <+> 2 = 3
[1] <+> [2] = [3]
[[1]] <+> [[2]] = [[3]]
...
我知道在Haskell中添加列表的惯用方法是使用
+
来处理a
,使用zipWith (+)
来处理[a]
。也许对于[[a]]
可以类似地使用zipWith (zipWith (+))
等方法。但是,可以使用类型类或Haskell的其他特性通过一个运算符实现这个功能吗?我知道这只是语法糖,但如果可能的话,它会更加优雅。
-- 更新 --
如@DanielWagner的答案所述,使用
(Num a)
可能存在问题,最好为基本情况分别定义Integer、Double
等。 只是为了记录,我刚刚尝试了建议的方法:{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
class Additive a where (<+>) :: a -> a -> a
instance Num a => Additive a where (<+>) = (+)
instance Additive a => Additive [a] where (<+>) = zipWith (<+>)
或者
{-# LANGUAGE DefaultSignatures #-}
class Additive a where
(<+>) :: a -> a -> a
default (<+>) :: Num a => a -> a -> a
(<+>) = (+)
无论哪种情况,当加载
.hs
文件或评估[[1,2]] <+> [[3,4]]
时都会出现错误。
Monoid
的类,并创建不同的实例。 - dfeuer[1,2] <+> [3,4]
得到什么结果?[[1,2],[3,4]] <+> [[5,6],[7,8]]
呢?还有[1,2,3,4] <+> []
?需要考虑很多特殊情况。 - Rein HenrichsX(i,j) + Y(i,j)
。 - yǝsʞǝla