我试图返回列表中的第二个元素,例如[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