2015-02-06 177 views
0

我試圖返回列表中的第二個元素,例如[1; 2; 3; 4]會返回[2; 4],它適用於任何類型的名單,但我真的很努力使這項工作,我不確定爲什麼它不會工作,有人可以幫助我嗎?在Ocaml中返回列表的每一個其他元素

let rec everyEven a = function 
|[]->[] 
|x::y::t -> y::everyEven t 
+1

那麼'a'參數的目的是什麼?單個項目列表會發生什麼?你幾乎有它... – 2015-02-06 07:29:45

+1

可能重複的[OCaml - 返回一個列表,包含輸入列表中的所有元素在偶數位置](http://stackoverflow.com/questions/28269126/ocaml-return-a-list含-全的元素 - 在偶數位置內式輸入) – PatJ 2015-02-06 14:14:01

回答

1

首先,讓我們來測試你的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];;回報[]

1

由於您僅使用a來匹配它,所以function構造是適當的。下面是如何(也分組具有相同結果的情況):

let rec everyEven = function 
    | [] | [_] -> [] 
    | _::y::t -> y::everyEven t 
相關問題