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

时间:2015-02-06 07:22:54

标签: ocaml

我试图在列表中返回第二个元素,例如[1; 2; 3; 4]将返回[2; 4]并且它适用于任何类型的列表,但我真的很难做这项工作,我不确定为什么它不起作用,有人可以帮助我吗?

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

2 个答案:

答案 0 :(得分:1)

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

  

错误:此表达式的类型为'列表 - > '列表,但表达式需要类型'列表

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

错误说明everyEven t想要通用列表来生成通用列表。这意味着everyEven(w / o t)通常需要两个参数(而不是您认为的一个)。这是因为您使用的function关键字是匿名参数的内置模式匹配。然后让我们在参数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];;返回[]

答案 1 :(得分:1)

由于您仅使用a进行匹配,因此function构造是合适的。以下是如何(也将具有相同结果的案例分组):

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