空列表列表的模式匹配

问题描述 投票:1回答:1

我正在为大学做家庭作业,我正面临一个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

sml ml
1个回答
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。

没有老师的暗示我就不会来这个解决方案。

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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.