2012-09-27 3 views
1

행렬이 단수인지 확인하기 위해 SML 프로그램을 작성하려고합니다. 매트릭스가 목록 목록으로 표시되었습니다. 예 [[1,2], [3,4], [15,50]]은 유효한 것이지만 [[1,2], [1,2,3]]는 아닙니다.SML - 캐치되지 않는 예외 빈

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

fun removed (l,r)= 
    let fun iter(l,m)=if tl(l)=[] 
     then [email protected][remove (hd(l),r)] 
     else iter(tl(l),[email protected][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 기능이 정의되었지만 입력을 입력하면 캐치되지 않은 예외 빈 오류가 발생합니다. 제발 디버깅 도와주세요.

감사

문제는 빈리스트에 hd 또는 tl 중 하나를 호출하는 시도에서 유래
+1

때문에, 그것을 게시하기 전에 코드를 정리하십시오 사람들은 실제로 * 읽을 수 있습니다. 빈 목록에서 nth를 호출하려고하기 때문에 오류가 'nth'호출과 함께 발생할 가능성이 큽니다. –

답변

6

.

그런 종류의 문제를 피하는 가장 좋은 방법은 가능할 때마다 그러한 기능을 피하는 것입니다. 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 *) 
관련 문제