将列表添加到列表列表

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)

对我有用。