2

行列が特異であるかどうかをチェックする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は定義されますが、入力すると、キャッチされない例外が空になるというエラーが発生します。デバッグを手伝ってください。

ありがとう

4

1 に答える 1

9

hdこの問題は、空のリストまたは空のリストのいずれかを呼び出そうとしたことに起因しtlます。

この種の問題を回避する最善の方法は、可能な限りこれらの関数を回避することです。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 *)
于 2012-09-27T16:54:11.877 に答える