笛卡尔积类型错误

Cartesian product type error

我正在尝试创建一个给定 2 个列表('a list'b list)returns a ('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. 您正在调用 aux,初始累加器值为 ([], [])。这是两个列表的元组,而不是元组列表。
  2. 在最后一个模式匹配分支中,您使用 (ha, hb) 递归调用 aux,它是单个元组,而不是元组列表。

您可能想要的是让 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;;