空列表列表的模式匹配
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。
没有老师的提示,我不会得出这个解决方案。
感谢您帮助我思考这个问题并告诉我至少我的编码方式是正确的。
我正在做大学作业,我遇到了 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。
没有老师的提示,我不会得出这个解决方案。
感谢您帮助我思考这个问题并告诉我至少我的编码方式是正确的。