我試圖返回列表中的第二個元素,例如[1; 2; 3; 4]會返回[2; 4],它適用於任何類型的名單,但我真的很努力使這項工作,我不確定爲什麼它不會工作,有人可以幫助我嗎?在Ocaml中返回列表的每一個其他元素
let rec everyEven a = function
|[]->[]
|x::y::t -> y::everyEven t
我試圖返回列表中的第二個元素,例如[1; 2; 3; 4]會返回[2; 4],它適用於任何類型的名單,但我真的很努力使這項工作,我不確定爲什麼它不會工作,有人可以幫助我嗎?在Ocaml中返回列表的每一個其他元素
let rec everyEven a = function
|[]->[]
|x::y::t -> y::everyEven t
首先,讓我們來測試你的ocaml的腳本(例如,使用頂層):
Error: This expression has type 'a list -> 'a list but an expression was expected of type 'a list
其中everyEven t
加下劃線以表示問題出在哪裏。現在是時候到相信類型,因爲你應該在函數式編程中一直這樣做。
錯誤表示您要everyEven t
想要一個通用列表來生成一個通用列表。這意味着everyEven
(w/o t
)通常會期望兩個參數(而不是您認爲的一個參數)。這是因爲您正在使用function
關鍵字,該關鍵字是匿名參數的內置模式匹配。那麼,讓我們指定的參數a
模式匹配:
let rec everyEven a =
match a with
|[]->[]
|x::y::t -> y::everyEven t ;;
其結果是,該代碼被接受,但出現警告:
Warning 8: this pattern-matching is not exhaustive. Here is an example of a value that is not matched: _::[]
這意味着我們也應該提供的情況下,一元清單:
let rec everyEven a =
match a with
|[]-> []
|[_] -> []
|x::y::t -> y::everyEven t ;;
就是這樣! 一些運行測試:
everyEven [1;2;3;4] ;;
[2;4]
.
雖然everyEven [1;2;3];;
回報[2]
和everyEven [1];;
回報[]
。
由於您僅使用a
來匹配它,所以function
構造是適當的。下面是如何(也分組具有相同結果的情況):
let rec everyEven = function
| [] | [_] -> []
| _::y::t -> y::everyEven t
那麼'a'參數的目的是什麼?單個項目列表會發生什麼?你幾乎有它... – 2015-02-06 07:29:45
可能重複的[OCaml - 返回一個列表,包含輸入列表中的所有元素在偶數位置](http://stackoverflow.com/questions/28269126/ocaml-return-a-list含-全的元素 - 在偶數位置內式輸入) – PatJ 2015-02-06 14:14:01