将列表添加到列表列表
Add a list to a list of lists
我一直在尝试将列表添加到列表列表中。
我想要什么:
l1 : [[]] / [] / Empty list
l2 : [1;2]
result : [[1;2]]
add [1;3] to result :
result : [[1; 2]; [1; 3]]
我尝试使用 @ 和 :: 运算符已经有一段时间了,但仍然没有结果。
这是我的问题:
type sign = Neg | Zero | Pos | Error
let all_pairs (l1: sign list) (l2 : sign list) : sign list list =
let rec aux acc list =
match list with
| [] -> acc
| hd :: tl ->
let rec m_aux m_acc m_list =
match m_list with
| [] -> aux (m_acc :: acc) tl
| m_hd :: m_tl -> m_aux (m_hd :: m_acc) m_tl
in m_aux [hd] l2
in aux [] l1
给定L1,L2是符号表,return一个符号表列表,每两个符号x和y的组合,x在L1中,y在L2中
示例:
L1 : [Pos; Error]
L2 : [Neg; Zero]
all_pairs L1 L2 应该 return
[ [Pos; Neg]; [Pos; Zero]; [Error; Neg]; [Error; Zero] ]
完全按照这个顺序
我不明白你的第一行。但是这里 session 展示了如何建立您似乎要求的结果:
# let l1 = [];;
val l1 : 'a list = []
# let l2 = [1;2];;
val l2 : int list = [1; 2]
# let result1 = l1 @ [l2];;
val result1 : int list list = [[1; 2]]
# let l3 = [1;3];;
val l3 : int list = [1; 3]
# let result2 = result1 @ [l3];;
val result2 : int list list = [[1; 2]; [1; 3]]
一个问题是您试图在末尾扩展您的列表。这在 OCaml 中是不自然的(或高效的)。如果您考虑在列表的开头添加新值,事情会更简单。
# let result3 = l3 :: l1;;
val result3 : int list list = [[1; 3]]
# let result4 = l2 :: result3;;
val result4 : int list list = [[1; 2]; [1; 3]]
::
运算符将新值添加到列表的开头。没有用于添加到列表末尾的单个运算符(因为它不自然或效率低)。
更新
您可以像这样编写您的函数:
let all_pairs l1 l2 =
List.concat
(List.map
(fun a -> List.map (fun b -> [a;b]) l2)
l1)
对我有用。
我一直在尝试将列表添加到列表列表中。
我想要什么:
l1 : [[]] / [] / Empty list
l2 : [1;2]
result : [[1;2]]
add [1;3] to result :
result : [[1; 2]; [1; 3]]
我尝试使用 @ 和 :: 运算符已经有一段时间了,但仍然没有结果。
这是我的问题:
type sign = Neg | Zero | Pos | Error
let all_pairs (l1: sign list) (l2 : sign list) : sign list list =
let rec aux acc list =
match list with
| [] -> acc
| hd :: tl ->
let rec m_aux m_acc m_list =
match m_list with
| [] -> aux (m_acc :: acc) tl
| m_hd :: m_tl -> m_aux (m_hd :: m_acc) m_tl
in m_aux [hd] l2
in aux [] l1
给定L1,L2是符号表,return一个符号表列表,每两个符号x和y的组合,x在L1中,y在L2中
示例:
L1 : [Pos; Error]
L2 : [Neg; Zero]
all_pairs L1 L2 应该 return
[ [Pos; Neg]; [Pos; Zero]; [Error; Neg]; [Error; Zero] ]
完全按照这个顺序
我不明白你的第一行。但是这里 session 展示了如何建立您似乎要求的结果:
# let l1 = [];;
val l1 : 'a list = []
# let l2 = [1;2];;
val l2 : int list = [1; 2]
# let result1 = l1 @ [l2];;
val result1 : int list list = [[1; 2]]
# let l3 = [1;3];;
val l3 : int list = [1; 3]
# let result2 = result1 @ [l3];;
val result2 : int list list = [[1; 2]; [1; 3]]
一个问题是您试图在末尾扩展您的列表。这在 OCaml 中是不自然的(或高效的)。如果您考虑在列表的开头添加新值,事情会更简单。
# let result3 = l3 :: l1;;
val result3 : int list list = [[1; 3]]
# let result4 = l2 :: result3;;
val result4 : int list list = [[1; 2]; [1; 3]]
::
运算符将新值添加到列表的开头。没有用于添加到列表末尾的单个运算符(因为它不自然或效率低)。
更新
您可以像这样编写您的函数:
let all_pairs l1 l2 =
List.concat
(List.map
(fun a -> List.map (fun b -> [a;b]) l2)
l1)
对我有用。