2015-02-06 130 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 
相关问题