首页 > 解决方案 > 空列表列表的模式匹配

问题描述

我正在为大学做作业,并且在 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,但没有发现任何提示。您能给我一个提示(或链接或关键字以便更好地搜索)吗?

谢谢,乔臣

标签: smlml

解决方案


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

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。

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

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


推荐阅读