SML-未捕获异常为空
我试图写一个SML程序来检查矩阵是否是奇异的。 矩阵已表示为列表列表。示例[[1,2]、[3,4]、[15,50]]是有效的,但[[1,2]、[1,2,3]]不是SML-未捕获异常为空,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 remo
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
函数detere已定义,但当我向其提供输入时,会出现uncaughtexceptionempty错误。请帮我调试一下
谢谢问题源于试图在空列表中调用
hd
或tl
避免此类问题的最佳方法是尽可能避免使用这些函数。100次中有99次,您可以改用模式匹配,然后编译器将检查您是否同时处理非空列表和空列表
要在列表上使用模式匹配,请使用类似于以下模式的内容:
而不是
fun f ls = ... (* code where you use hd ls, tl ls *)
使用
请在发布之前清理代码,以便人们能够真正阅读。您的错误很可能是在调用
nth
时发生的,因为您最终尝试在空列表中调用nth。
fun f (x::xs) = ... (* non-empty list; x = the head, xs = the tail *)
| f [] = ... (* empty list *)