sml - 空列表列表的模式匹配
问题描述
我正在为大学做作业,并且在 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,但没有发现任何提示。您能给我一个提示(或链接或关键字以便更好地搜索)吗?
谢谢,乔臣
解决方案
好吧,伙计们,答案有点奇怪。
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。
如果没有老师的暗示,我不会得出这个解决方案。
感谢您帮助思考这个问题并告诉我我至少在我的编码方式上是正确的。
推荐阅读
- ios - 在同一个 UIViewController 中打开多个文件
- c# - 将 Form1 转换为 Form2
- java - 为什么这个测试会通过?
- wordpress - Gravity Forms - 将字段条目显示为实时预览
- react-native - 处理抽屉导航器时获取参数未定义
- charts - 如何使用 gnuplot 中的列来分隔绘图
- java - 我们可以将 EAR 中的 lib jar 与 Websphere 中的共享库引用结合起来吗?
- javascript - Javascript在while循环中改变不透明度不起作用
- firebase - 如何修复 Firebase Analytics 插件安装错误
- python - 如何将列表组合并转换为一个数据框?