我正在为大学做家庭作业,我正面临一个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,但没有找到提示。你能给我一个提示(或链接或关键词以便更好地搜索)吗?
谢谢,Jochen
好吧,伙计们,答案有些奇怪。
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。
没有老师的暗示我就不会来这个解决方案。
感谢您帮助思考这个问题并告诉我,我至少对我编码的方式是正确的。