【问题标题】:Syntax Error In OCaml Multiply FunctionOCaml 乘法函数中的语法错误
【发布时间】:2015-10-27 03:31:01
【问题描述】:

我写了一个函数,它给我一个语法错误,不知道为什么。您可以跳到底部阅读代码和错误,这里的其余内容只是更多可能不需要的信息。

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

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 是其中的累加器,i 用于跟踪我需要多少个零

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

【问题讨论】:

  • 什么是padZero、mulByDigit、克隆?
  • 我已经写过的函数我不想在这里发布,因为那将在这里发布几乎整个家庭作业。不过我会给出他们的原型。
  • # 克隆 3 5;; - : 整数列表 = [3; 3; 3; 3; 3]
  • padZero [9;9] [1;0;0;2];; - : int list * int list = ([0;0;9;9],[1;0;0;2])
  • 你真的应该得到 merlin,它可以帮助你更早地检查你的程序并发现错误。

标签: ocaml


【解决方案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

【讨论】:

    【解决方案2】:

    找到了:我写了两次in

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

    【讨论】:

      猜你喜欢
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      相关资源
      最近更新 更多