在Ocaml中返回列表的每一个其他元素

在Ocaml中返回列表的每一个其他元素,ocaml,Ocaml,我试图返回列表中的任何第二个元素,例如[1;2;3;4]将返回[2;4],它适用于任何类型的列表,但我真的很难做到这一点,我不确定为什么它不起作用,有人能帮我吗 let rec everyEven a = function |[]->[] |x::y::t -> y::everyEven t 首先,让我们测试您的ocaml脚本(例如,使用toplevel): 错误:此表达式的类型为“a列表->”a列表,但表达式的类型应为“a列表” 其中,everyEven t带下划线以指示问题所在

我试图返回列表中的任何第二个元素,例如[1;2;3;4]将返回[2;4],它适用于任何类型的列表,但我真的很难做到这一点,我不确定为什么它不起作用,有人能帮我吗

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

首先,让我们测试您的ocaml脚本(例如,使用toplevel):

错误:此表达式的类型为“a列表->”a列表,但表达式的类型应为“a列表”

其中,
everyEven t
带下划线以指示问题所在。现在是时候信任类型了,就像你在函数式编程中应该做的那样

错误表明
everyevent t
需要一个泛型列表来生成泛型列表。这意味着
everyen
(w/o
t
)通常需要两个参数(而不是您所认为的一个)。这是因为您使用的是
函数
关键字,它是匿名参数上的内置模式匹配。然后,让我们在参数
a
上指定模式匹配:

let rec everyEven a =
match a with
|[]->[]
|x::y::t -> y::everyEven t ;;
结果是代码被接受,但发出警告:

警告8:此模式匹配并非详尽无遗。下面是一个不匹配值的示例:::[]

这意味着我们还应提供一个元素列表的情况:

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
只是为了匹配,所以
函数
构造是合适的。以下是如何(也将具有相同结果的病例分组):


那么
a
参数的用途是什么?单项目列表会发生什么情况?你几乎拥有它…可能是它的复制品
let rec everyEven = function
  | [] | [_] -> []
  | _::y::t -> y::everyEven t