2012-09-20 4 views
0

처음으로 sml을 배우는 중이며 패턴 매칭을위한 구문에 대해 너무 확신하지 못합니다.SML에서 패턴 매칭을 사용하여 추가

연습으로 저는 이진수에 대한 간단한 프로그램을 만들려고했습니다.

datatype Digit = Zero | One 
type Nat = Digit list 

fun inc [] = One::[] 
| inc (Zero::rest) = (One::rest) 
| inc (One::rest) = Zero::inc(rest) 

fun dec [] = [] 
| dec (One::rest) = (Zero::rest) 
| dec (Zero::rest) = One::dec(rest) 


fun add (ds1, ds2) = 
    let 
    fun addition ([],[],Zero) = [] 
      | addition (ds1, [], Zero) = ds1 
      | addition ([], ds2, Zero) = ds2 
      | addition (One, Zero, Zero) = (One::ds1) 
      | addition (One, Zero, One) = Zero::addition(ds1,ds2,One) 
      | addition (Zero, One, Zero) = (One::ds1) 
      | addition (Zero, One, One) = Zero::addition(ds1,ds2,One) 
      | addition (Zero, Zero, Zero) = (Zero::ds1) 
      | addition (Zero, Zero, One) = (One::ds1) 
      | addition (One, One, Zero) = Zero::addition(ds1,ds2,One) 
      | addition (One, One, One) = One::addition(ds1,ds2,One) 
    in 
     addition(ds1, ds2, Zero) 
    end 

처음 두 작업을 찾을 수 있지만 추가 기능을 사용할 수 없습니다. 세 번째 함수의 핵심은 이진수를 추가하고 자릿수 목록을 반환하는 것입니다.

도움을 주시면 감사하겠습니다. addition의 실수가 [], ds1 등과 호환 그래서 OneZero이리스트는 아니라는 것이다 감사

답변

1

.

incdec으로 잘 수행했습니다. 당신은 더 저를 단순화 할 수

fun add (ds1, []) = ds1 
    | add ([], ds2) = ds2 
    | add (Zero::ds1, d::ds2) = d::add(ds1, fs2) 
    | add (One::ds1, Zero::ds2) = One::add(ds1,ds2) 
    | add (One::ds1, One::ds2) = Zero::inc(add(ds1,ds2)) 
+0

: 첫 번째 경우는 중복, 유사, 6 케이스 4에 의해 표현 될 수있는 당신이 add 동일한 패턴을 사용하고 사용자가 만든 inc의 사용을 만들 수있을 것 같아요 '(Zero :: ds1, d :: ds2)'와'(d :: ds1, Zero :: ds2) '형식 중 오직 두 가지만 사용합니다. –

+0

@AndreasRossberg : 감사합니다. 귀하의 제안에 따라 답변을 업데이트했습니다. – pad

관련 문제