我正在尝试创建一个给定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;;
答案 0 :(得分:1)
这里有几个问题:
aux
,初始累加器值为([], [])
。这是两个列表的元组,而不是元组列表。aux
递归调用(ha, hb)
,这是一个单元组,而不是元组列表。你可能想要的是让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;;