空列表列表的模式匹配

pattern matching of list of empty list

我正在做大学作业,我遇到了 webassign 门户的一个奇怪问题(你把你的代码放进去,它会检查是否一切正常)。

我们需要编写一个函数来乘以矩阵。这是使用向量乘法,矩阵乘向量,矩阵乘矩阵一步步完成的。

我的代码在 smlnj 解释器上是 运行,但在 webassign 中不是:

fun v_v_mult [] _  = 0.0
  | v_v_mult _  [] = 0.0
  | v_v_mult (r::rs) (c::cs) = r*c + v_v_mult rs cs

fun m_v_mult [] _  = []
  | m_v_mult _  [] = []
  | m_v_mult (rv::rvs) cs = v_v_mult rv cs :: m_v_mult rvs cs

所以,我的 REPL 中的一切都很好,但是 webassign 告诉我

m_v_mult [[]] [] 

引发异常。我无法在我的 REPL 中重现异常,因为上面的代码按预期工作。

模式匹配一​​个空列表的列表需要什么特别的吗?我搜索了计算器,但没有发现任何提示。你能给我一个提示(或 link 或关键字以便更好地搜索)吗?

谢谢, 约臣

好的,伙计们,答案有点奇怪。

fun m_v_mult [] _  = []
  | m_v_mult (rv::rvs) cs = v_v_mult rv cs :: m_v_mult rvs cs

即第二行被删除。

那是因为,m_v_mult [[]] []第一个参数没有空矩阵,而是一个只有一行的矩阵,它是空的。因此结果应该是一个包含一个元素的向量,其中包括 0 个数字的总和。所以结果应该是加法的标识,即 0。最后一个案例会得到这个结果,它调用 v_v_mult,在那个案例中 returns 0。

没有老师的提示,我不会得出这个解决方案。

感谢您帮助我思考这个问题并告诉我至少我的编码方式是正确的。