空列表列表的模式匹配

时间:2019-04-08 17:02:21

标签: sml ml

我正在为大学做作业,并且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中重现异常,因为上面的代码按预期工作。

与空列表匹配的模式是否需要特殊设置?我搜索了stackoverflow,但没有发现任何提示。您能给我一个提示(或链接或关键词,以便更好地搜索)吗?

谢谢, 约臣

1 个答案:

答案 0 :(得分:0)

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

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,在这种情况下返回0。

在没有老师提示的情况下,我不会来解决这个问题的。

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