我试图在列表中返回第二个元素,例如[1; 2; 3; 4]将返回[2; 4]并且它适用于任何类型的列表,但我真的很难做这项工作,我不确定为什么它不起作用,有人可以帮助我吗?
let rec everyEven a = function
|[]->[]
|x::y::t -> y::everyEven t
答案 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