SML - 未捕获的异常为空

标签 sml

我正在尝试编写一个 SML 程序来检查矩阵是否为奇异矩阵。 矩阵已表示为列表的列表。示例 [[1,2],[3,4],[15,50]] 是有效的,但 [[1,2],[1,2,3]] 不是。

fun remove (l,r)= 
    let fun iter(front,l,i)= 
      if i=r then front@tl(l) 
      else
        iter(front@[hd(l)],tl(l),i+1)
    in 
    iter([],l,1) end;

fun removed (l,r)=
    let fun iter(l,m)=if tl(l)=[] 
      then m@[remove (hd(l),r)] 
      else iter(tl(l),m@[remove (hd(l),r)])
    in
    iter(tl(l),[]) end;

fun nth (l,i)=let fun iter(l,c)=if i=c then hd(l) else iter(tl(l),c+1) in iter(l,1) end;

fun deter (l)=let fun iter(det,i,j)=if i=(length l)+1 then det else iter (det+j*(nth (hd(l),i))*(deter (removed(l,i))),i+1,j*(~1))
                 in iter(0,1,1) end

函数 deter 已定义,但当我向其输入时,发生未捕获异常为空的错误。请帮我调试一下。

谢谢

最佳答案

问题源于试图在空列表上调用 hdtl

避免此类问题的最佳方法是尽可能避免使用这些函数。 100 次中有 99 次,您可以改用模式匹配,然后编译器将检查您是否处理了非空列表和空列表。

要在列表上使用模式匹配,您可以使用类似于以下模式的内容:

代替

fun f ls = ... (* code where you use hd ls, tl ls *)

使用

fun f (x::xs) = ... (* non-empty list; x = the head, xs = the tail *)
  | f []      = ... (* empty list *)

关于SML - 未捕获的异常为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12625954/

相关文章:

sml - 子句的右侧与函数结果类型不一致

SML:非构造函数应用于模式 @ 中的参数

list - SML,编写一个连接列表列表的函数

sml - 如何在机器学习编程语言中定义具有多种类型的树

polymorphism - SML中不使用数据类型的多态加法函数

recursion - 递归绑定(bind)内的 SML 语法限制?

module - '如何正确使用高阶仿函数 ?' or ' 如何在 funsigs 中获得真正的乐趣?

pattern-matching - SML 如何定义正确的选项

list - SML-NJ 列表等于 Nil 与 Null 列表

sml - 从 ml 输出中删除哈希值