我写了一个函数,它给我一个语法错误,不完全确定原因。您可以跳到底部并阅读代码和错误,这里的其他内容只是可能不需要的更多信息。
我必须创建一个乘法数字函数,它将两个数字列表相乘,并将结果作为列表返回。
let bigMul l1 l2 =
let f a x = failwith "to be implemented" in
let base = failwith "to be implemented" in
let args = failwith "to be implemented" in
let (_, res) = List.fold_left f base args in
res
它假装代表大整数作为列表,所以1234x24是[1; 2; 3; 4] x [2; 4]它使用了我已编写和测试过的几个函数。一个是mulByDigit,它将列表中的每个int乘以一个int并返回一个列表,例如[2; 3; 4; 5] 1将返回[2; 3; 4; 5]。它还使用padZero,它获取2个整数列表,并通过向较短的一个添加零来使它们的长度相等,并返回具有两个列表ex [1; 2; 3]和[1]的元组将返回一个元组([1] ; 2; 3],[0; 0; 1])。最后一个函数bigAdd采用2个列表并添加它们并返回结果,就像[1; 2; 3] [1; 2; 3]它将给出[2; 4; 6]。所有这些功能都经过测试并正常工作,所以我不会为它们提供代码。
我编写了一个函数,该函数遵循列表l1的逻辑,将它乘以l2的每个数字与尾随零,取决于数字并保持总和。例如,如果列表1是[1; 2; 3; 4]并且l2是[2; 4]我取第二个列表并首先将其反转以得到[4; 2]然后我将1234乘以4得到结果。我将这个结果添加到累加器中的当前值,这是最初没有任何内容,并递增i让我知道下一个有一个尾随零。然后我取2剩余并乘以1234并且有一个尾随零所以24680.我将它添加到我的旧累加器以获得最终值并在l2中没有剩余数字时返回该值。所以1234 + 24680 = 25914。这是我写的功能。 a是其中的累加器,我用于跟踪我需要多少个零
let bigMul l1 l2 =
let f (i,a) x =
let sum = padZero ( (mulByDigit x l1)@(clone 0 i) ) a in
in let (first,second) = match sum with
| (y,z)->(y,z) in
( i+1, ( bigAdd first second ) ) in
let base = (0,[]) in
let args = List.rev ( l2 ) in
let (_, res) = List.fold_left f base args in
res
我在运行它时出现语法错误,表示未绑定的值l2。不知道为什么这么想。
答案 0 :(得分:1)
这就是我所看到的:
let sum = padZero ( (mulByDigit x l1)@(clone 0 i) ) a in
in let (first,second) = match sum with
这里有两个in
个关键字。
为了它的价值,这个:
let (first,second) = match sum with
| (y,z)->(y,z)
in
相当于:
let (first, second) = sum in
答案 1 :(得分:0)
找到它:我写了in
两次
let sum = padZero ( (mulByDigit x l1)@(clone 0 i) ) a in
in let (first,second) = match sum with