笛卡儿产品类型错误

时间:2017-11-04 16:11:29

标签: list recursion types ocaml cartesian-product

我正在尝试创建一个给定2个列表('a list'b list)的函数返回('a*'b) list,它是两个列表的笛卡尔积。 我试过这个,但它得到了'a list list而不是'a list,等于'b。 所以,我问是否有人可以告诉我我哪里错了,以及为什么OCaml要求'a list list代替'a list

let lprod l1 l2 =
let rec aux lista la lb =
    match la,lb with 
        [],_ -> lista
        |ha::ta,[] -> aux lista ta l2
        |ha::ta,hb::tb -> aux (ha,hb) la tb
in aux ([],[]) l1 l2;;

1 个答案:

答案 0 :(得分:1)

这里有几个问题:

  1. 您正在调用aux,初始累加器值为([], [])。这是两个列表的元组,而不是元组列表。
  2. 在最后一个模式匹配分支中,您使用aux递归调用(ha, hb),这是一个单元组,而不是元组列表。
  3. 你可能想要的是让1中的初始值只是一个空列表,然后使用cons(::)将元组追加到2中的累加器。

    编辑:这是您的实施的固定版本:

    let lprod l1 l2 =
      let rec aux acc la lb =
        match la, lb with 
        | [], _ -> acc
        | ha::ta, [] -> aux acc ta l2
        | ha::ta, hb::tb -> aux ((ha, hb)::acc) la tb
      in aux [] l1 l2;;