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
등과 호환 그래서 One
및 Zero
이리스트는 아니라는 것이다 감사
: 첫 번째 경우는 중복, 유사, 6 케이스 4에 의해 표현 될 수있는 당신이
add
동일한 패턴을 사용하고 사용자가 만든inc
의 사용을 만들 수있을 것 같아요 '(Zero :: ds1, d :: ds2)'와'(d :: ds1, Zero :: ds2) '형식 중 오직 두 가지만 사용합니다. –@AndreasRossberg : 감사합니다. 귀하의 제안에 따라 답변을 업데이트했습니다. – pad