如何在Haskell中添加两个类似matlab的列表?

如何在Haskell中添加两个类似matlab的列表?,matlab,haskell,Matlab,Haskell,我想知道是否有可能编写一个Haskell加法运算符,它可以处理两个数字、两个数字列表、两个数字矩阵。。。等等也就是说,是否可以定义一个,使以下所有功能都能正常工作 1 <+> 2 = 3 [1] <+> [2] = [3] [[1]] <+> [[2]] = [[3]] ... 或 {-#语言默认签名} a类加法器,其中 ()::a->a->a 默认值()::Num a=>a->a->a () = (+) 在任何一种情况下,加载.hs文件或评估[[1,2]

我想知道是否有可能编写一个Haskell加法运算符,它可以处理两个数字、两个数字列表、两个数字矩阵。。。等等也就是说,是否可以定义一个
,使以下所有功能都能正常工作

1 <+> 2 = 3
[1] <+> [2] = [3]
[[1]] <+> [[2]] = [[3]]
...

{-#语言默认签名}
a类加法器,其中
()::a->a->a
默认值()::Num a=>a->a->a
() = (+)
在任何一种情况下,加载
.hs
文件或评估
[[1,2]][[3,4]]]
时都会出现错误是的,可能:

class Additive a where (<+>) :: a -> a -> a
instance Additive Integer where (<+>) = (+)
instance Additive a => Additive [a] where (<+>) = zipWith (<+>)
优点是某些实例可能很短,例如

instance Additive Integer
instance Additive Int
instance Additive Double
instance Additive Float

如果没有任何额外的方法定义,所有这些都将按预期工作。

好吧,您可能会编写一个类似于
Monoid
的类,使用不同的实例。为了使这一点有趣,您需要提供更全面的示例。您希望
[1,2][3,4]
提供什么?那么
[[1,2],[3,4][[5,6],[7,8]]
呢?那
[1,2,3,4][]
呢?有很多边缘情况需要考虑。Matlab/OCTAVE将在最后一个例子中给出维度不匹配的错误,否则它是<代码> x(i,j)+y(i,j)< /代码>。即使可能,这也是个坏主意。Matlab实际上很好地证明了这一点,如果你问我…@leftaroundabout,我认为这对Matlab来说是个坏主意,因为尺寸可以任意折叠,以允许例如1+[2]。不是这里的情况吗?有没有优雅的方法可以用
Num
替换
Integer
?当然:
instance Num a=>加法a,其中()=(+)
@ReinHenrichs只在启用
FlexibleInstances
的情况下工作,对吗?@AlekseyIzmailov是,但是
FlexibleInstances
肯定是Haskell常见的GHC方言的一部分。@tinlyx一般来说,您不能将
Num a
作为基本情况。相反,为您关心的每种类型创建添加的实例--
Int
Double
,等等。(考虑一下如果我编写
实例Num a=>Num[a]where…
!)会发生什么情况)
class Additive a where (<+>) :: a -> a -> a
instance Additive Integer where (<+>) = (+)
instance Additive a => Additive [a] where (<+>) = zipWith (<+>)
*Main> 1 <+> 2
3
*Main> [1] <+> [2]
[3]
*Main> [[1]] <+> [[2]]
[[3]]
{-# LANGUAGE DefaultSignatures #-}
class Additive a where
    (<+>) :: a -> a -> a
    default (<+>) :: Num a => a -> a -> a
    (<+>) = (+)
instance Additive Integer
instance Additive Int
instance Additive Double
instance Additive Float