2015-10-27 51 views
0

我写的是给我一个语法错误,不知道是什么原因的功能。你可以跳到这里的底部,阅读代码和错误,这里的其他内容只是更多可能不需要的信息。语法错误在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]×[2; 4]它使用,我已经创作并测试了几种功能。一个是mulByDigit,它将列表中的每个int乘以一个int并返回一个列表,如[2; 3; 4; 5] 1将返回[2; 3; 4; 5]。它还使用了padZero,它接受2个ints列表,并通过将0添加到较短的列表并返回一个具有列表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结果。我将这个结果添加到累加器中的当前值,它不是一开始就增加我让我知道下一个尾随零。然后我把余下的2乘以1234,并有一个尾随零,如24680.我将它加到我的旧累加器中以获得最终值并在l2中没有更多数字时返回值。所以1234 + 24680 = 25914。这是我写的功能。一个是它的蓄电池,我是保持的我有多少个零需要

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

什么是padZero,mulByDigit,克隆? –

+0

我已经写过的函数我不想在这里发布它们,因为这将在这里发布几乎整个作业任务。我尽管给他们的原型。 –

+0

#clone 3 5 ;;; - :int list = [3; 3; 3; 3; 3] –

回答

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 
+0

很酷很有用 –

0

发现:我写in两次

let sum = padZero ((mulByDigit x l1)@(clone 0 i)) a in 
    in let (first,second) = match sum with