F#从两个列表中制作成对列表

时间:2018-12-28 19:37:17

标签: f#

我需要在F#中创建一个函数以将两个列表中的元素配对在一起(请参见下图中的(ii)):enter image description here 我实际上并不完全确定问题在问什么:我是否需要创建一个接受两个列表并返回一个成对列表的函数,其中结果列表中的第ith个元素是一个对,而该对中的第一个元素是ith个元素对中的第一个列表和第二个元素中的第二个列表中的第i个元素是?我不明白*val pairlists :'a list * 'b list -> ('a * 'b)list中的含义

如果那是我应该做的,那么这就是我尝试过的:

let pairlists (l : 'a list) (m : 'b list) =
    if l.Length <> m.Length then 
        failwith "the two lists does not have the same size"
    else 
        [for i in 1 .. l.Length do
            yield (l.Head,m.Head)

        ]

我不确定该怎么做,因为我不知道如何遍历列表? 帮助

2 个答案:

答案 0 :(得分:3)

您可以使用match ... with表达式通过模式匹配来遍历列表。

例如:

f l = 
   match l with
   | head :: tail -> "This list has at least one element!"
   | _ -> "This list is empty"

> f [1]
> "This list has at least one element!"

> f [1; 2]
> "This list has at least one element!"

> f []
> "This list is empty"

在您的情况下,可能有几种可能性:两个列表都是空的,一个列表是空的,另一个列表不是,或者两个都有至少一个元素:

pairlists l m =
    match l, m with
    | (lhead :: ltail), (mhead :: mtail) ->  // both non-empty
    | [], (mhead :: mtail) ->  // first list empty, second is not
    | (lhead :: ltail), [] ->  // second is empty, first is not
    | [], [] ->  // both are empty

现在您要做的就是确定这四种情况中每种情况下函数的结果,然后将其写下来。

我不会给您完整的答案,因为这显然是家庭作业,但这是另一个提示:将两个非空列表配对意味着将其头部(即第一个元素)配对,然后将其尾部配对,然后再附加两个在一起。

答案 1 :(得分:2)

函数签名中的*表示输入是两个列表的元组,而输出是元组列表。 最简单的方法是使用List.zip函数:

let pairlists ((a, b) : 'a list * 'b list) = 
    List.zip a b

在这里,我们将输入参数定义为“ a列表”和“ b列表”的元组,并将列表相应地传递到List.zip : 'T1 list -> 'T2 list -> ('T1 * 'T2) list