2014-04-24 34 views
-2
let rec test a b = 
    match a with 
    |[] -> [] 
    |(e,r)::tails -> if b = e then r::(test tails b) 
         else test tails b 

let test2 g = 
    match g with 
    |e,r -> e, (test r) 

我對上述兩個函數有兩個問題。如何將OCaml中的兩個函數結合起來?

  1. test2呼籲test。我怎麼能testtest2,所以它成爲一個功能?

  2. test2,與e,r ->e, (test r)行 - test接受2個參數,但在這裏我們只通過r,那麼這行是什麼意思?

回答

3

鑑於問題2,我假定你沒有寫這些函數。所以,被弄來他們,因爲他們是非常糟糕的書面(參見下文),所以很難知道如何回答你的問題......總之:

首先,請注意,在許多情況下,保持兩份獨立的功能使代碼更容易閱讀,維護,再利用,等等......這就是說,可能有兩種方法可以做到這一點:

  • 你既可以定義testtest2。在這種情況下,你會寫(保持你的testtest2定義即是):

    let test2 g = 
        let rec test a b = 
        match a with 
        |[] -> [] 
        |(e,r)::tails -> if b = e then r::(test tails b) 
            else test tails b 
        in 
        match g with 
        |e,r -> e, (test r) 
    
  • 或者,以便它執行所有操作,但通常使代碼不太清楚,你可以重寫的功能 - - 就你而言,我認爲這並不合理。

2.test r只是部分應用程序:它是針對指定一個參數b,將返回test r b當一個函數。你應該閱讀:http://en.wikipedia.org/wiki/Currying(雖然我不知道,最好的主題簡介)

3.你給的功能如寫的不好,有幾個原因。下面是其中一些:

  • test不tailrec,當它可以很容易地(如果你不知道什麼tailrec手段,忘掉了它)
  • 名稱的選擇不是很好 - 所以很難知道是什麼。
  • 某些表達式可以簡化。比如,你可以寫:

    let test2 (e, r) = (e, test r) 
    

希望,幫助你! =)

相關問題