OCaml乘法函数中的语法错误

时间:2015-10-27 03:31:01

标签: ocaml

我写了一个函数,它给我一个语法错误,不完全确定原因。您可以跳到底部并阅读代码和错误,这里的其他内容只是可能不需要的更多信息。

我必须创建一个乘法数字函数,它将两个数字列表相乘,并将结果作为列表返回。

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。不知道为什么这么想。

2 个答案:

答案 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