笛卡尔积类型错误
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;;
这里有几个问题:
- 您正在调用
aux
,初始累加器值为 ([], [])
。这是两个列表的元组,而不是元组列表。
- 在最后一个模式匹配分支中,您使用
(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;;
我正在尝试创建一个给定 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;;
这里有几个问题:
- 您正在调用
aux
,初始累加器值为([], [])
。这是两个列表的元组,而不是元组列表。 - 在最后一个模式匹配分支中,您使用
(ha, hb)
递归调用aux
,它是单个元组,而不是元组列表。
您可能想要的是让 1 中的初始值只是一个空列表,然后使用 cons (::
).
编辑:这是您实施的固定版本:
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;;