使用模式匹配的SML加法
我是第一次学习sml,但我不太确定模式匹配的语法 作为练习,我试着制作一些关于二进制数的简单程序使用模式匹配的SML加法,sml,smlnj,Sml,Smlnj,我是第一次学习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 (Zer
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
前两项工作找到了,但我无法将其添加到工作中。第三个函数的作用是添加二进制数并返回数字列表
感谢您的帮助。
谢谢添加
中的错误是One
和Zero
不是列表,因此它们与[]
和ds1
等不兼容
您对inc
和dec
做得很好。我认为您可以对add
使用相同的模式,并使用您创建的inc
:
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))
您可以进一步简化:第一种情况是多余的,类似地,第四到第六种情况可以用两种形式表示:(Zero::ds1,d::ds2)
和(d::ds1,Zero::ds2)
@AndreasRossberg:谢谢,我根据您的建议更新了答案。