微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OCAML:合并2个列表的最简单方法

如何解决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 | zzlet 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 举报,一经查实,本站将立刻删除。