如何解决OCAML:合并2个列表的最简单方法
示例:合并[o; d] [l; n]返回[o; l; d; n]
let rec merge (x::t1) (y::t2) =
x::y::merge t1 t2;;
这会导致异常:Match_failure(“ // toplevel //”,1,14)
合并[o; d] [l; n]
后解决方法
您将merge
定义为接受3个参数(zip
和两个列表),但是递归调用仅向merge
提供2个参数。
更新
好的,修正的代码现在有一个问题,它不能处理两个列表为空的情况。由于进行了递归调用,因此保证每次输入都会最终失败。 (即,每次调用最终都会递归到其中一个列表为空的情况。)
您应该使用match
语句来处理不同的情况:空t1
,空t2
和您现在拥有的大小写(t1
和{{1 }}非空。
您可能会错过两种简单的情况,并使用错误的match表达式语法。
let name = function xx | yy | zz
是let name x = match x with xx | yy | zz
let rec merge a b = match (a,b) with
| (x::xs),(y::ys) -> x::y::merge xs ys
| xs,[] -> xs
| [],ys -> ys;;
语法糖版本:
let rec merge = function
| x::xs -> (function y::ys -> x::y::merge xs ys | [] -> x::xs)
| [] -> function ys -> ys
merge
是一个带有一个参数并返回另一个函数的函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。