2013-02-09 51 views
0

因此,我正在編寫摺疊組合函數,以使其執行過濾。合併摺疊和過濾器

let filter_combine (pred: 'a -> bool) : a' list -> 'a list -> 'a list = 
fun (x: 'a) (y: 'a list) -> x :: (filter pred y) 

我沒有任何編譯問題,但我的兩個測試用例中有一個失敗。我的實施有什麼問題?

這是一個失敗的測試用例...

[-1; 1] = fold (filter_combine (fun (x: int) -> (abs x) mod 2 <> 0)) [] [-2; -1; 0; 1; 2] 

這是工作的一個...

[-2; 2] = fold (filter_combine (fun (x: int) -> (abs x) > 1)) [] [-2; -1; 0; 1; 2] 
+0

'filter_combine'不正確,或者'filter'不是'List.filter'。 – didierc 2013-02-09 20:55:23

+1

你應該提供'fold'和'filter'的簽名。 – didierc 2013-02-09 20:57:14

回答

1

我遇到一些麻煩了解這個問題。我認爲你所說的是,你想編寫一個函數,該函數接受一個謂詞並返回一個適用於摺疊的函數,以便結果將根據謂詞進行過濾。

一些問題,這樣的問題:

  • 有沒有內置的命名fold OCaml的功能。

  • 如果你應該實現過濾,在你的實現中使用filter似乎很奇怪。

如果我假設你正在使用fold_right,那麼在我看來,你想回到a -> a list -> a list類型的函數。它想要看一件事來決定做什麼,而不是整件事。既然你說你沒有收到編譯錯誤,這表明你的函數名稱爲fold不能像我所期望的那樣工作。如果您顯示fold實際工作方式可能會有所幫助。