2015-10-27 50 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