2012-10-26 59 views
1

在管給出的骨架,它使用List.fold_left得到一個OCaml的功能填寫 val pipe : ('a -> 'a) list -> ('a -> 'a) 這樣pipe [f1;...;fn](其中f1,...,fn的功能!)返回一個函數f這樣,對於任何x,我們有f x返回結果fn(...(f2(f1 x)))ocaml的函數調用List.fold_left

同樣,您的任務是爲摺疊功能f和基本情況填寫適當的值。 一旦你已經實現的功能,你應該在OCaml的提示得到以下行爲:

# pipe [] 3;; 
- : int = 3 
# pipe [(fun x -> x+x); (fun x -> x + 3)] 3 ;; 
- : int = 9 
# pipe [(fun x -> x + 3);(fun x-> x + x)] 3;; 
- : int = 12 

以下是你需要填寫代碼:

let pipe fs = 
    let f a x = failwith "to be implemented" in 
    let base = failwith "to be implemented" in 
    List.fold_left f base fs 

有人可以幫助我?

+0

我認爲通常的作業規則是你應該顯示一些你已經嘗試過的代碼。沒有什麼可以評論的,沒有解決問題就很難提供幫助。 – jrouquie

+0

以及我認爲它的基地應該讓基地= 0,但我不知道f部分。我將如何做到這一點。 –

回答

0

你可能想先回答這些問題:

  • 寫管道調用其中僅使用基本情況的一個例子。
  • 何時使用基本情況?
  • 基本情況是什麼類型?
  • 什麼是f,ax的更好名稱,即這些變量的作用是什麼?
2

在你給出的骨架中,pipe只接受一個參數。根據管道類型(('a -> 'a) list -> 'a list),您知道此參數的類型爲('a -> 'a) list,並且您應該返回('a -> 'a)類型的某個值。

現在List.fold_left的形式是('b -> 'c -> 'b) -> 'b -> 'c list -> 'b的形式。但你知道:

  1. 它應該返回'a -> 'a類型的值,所以'b將與('a -> 'a)這裏

  2. 第三個參數是('a -> 'a) list類型的實例化,所以'c list('a -> 'a) list這裏:再次'c將用('a -> 'a)實例化。

您可以得出結論,您將使用List.fold_left在特殊類型(是的,這是一個拗口)

(('a -> 'a) -> ('a -> 'a) -> ('a -> 'a)) -> ('a -> 'a) -> ('a -> 'a) list -> ('a -> 'a) 

簡短地說:如果管道必須返回一個函數,並充分的功能列表,然後base本身必須是一個函數,而f必須帶兩個函數並返回一個函數。

哪個函數應該base是?如果fs是空列表,則會返回base,因此base應該具有預期的行爲pipe []

應該如何f a x結合了這兩種功能ax,既'a -> 'a類型,並返回一個單一的功能'a -> 'a?我會讓你在這裏想出一個答案。但是你想擁有以下等式的直覺:

f(pipe [f1; f2])f3 = pipe [f1; F2; f3]

(它適用於任何列表,而不僅僅是[f1; f2],但這個例子足夠了)。通過計算pipe [f1; f2]pipe [f1; f2; f3]的含義之間的關係,您將能夠定義組合函數f

需要注意的是,你可以寫的pipe功能在非常不同的方式從以下不同的骨架開始:

let pipe fs x = 
    let f a x = failwith "to be implemented" in 
    let base = failwith "to be implemented" in 
    List.fold_left f base fs 

在這種情況下,pipe需要兩個參數,('a -> 'a) list類型和其他的一個的類型'a,並且整個返回值應該是'a(一個值,而不是一個函數)類型。 f需要一個函數('a -> 'a)和一個值('a)並返回一個值,並且base只是一個值(您可以選擇哪一個?)。

我相信這第二種方法稍微簡單一點,因爲它不太抽象,但如果你老師要求你使用第一個骨架,可能是因爲它會教你關於操作函數和構建函數的函數。

+0

設管FS = 令F一X = A在 設基地+ X = O在 List.fold_left F基礎FS –

+0

這個編譯罰款,但它是錯的測試過程中,我在做什麼錯? –

+0

你寫的東西沒有意義。爲什麼你甚至會在一個多態函數中使用加法,該函數應該適用於任何數據類型''a',而不僅僅是整數? – gasche