我需要在F#中创建一个函数以将两个列表中的元素配对在一起(请参见下图中的(ii)):
我实际上并不完全确定问题在问什么:我是否需要创建一个接受两个列表并返回一个成对列表的函数,其中结果列表中的第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)
]
我不确定该怎么做,因为我不知道如何遍历列表? 帮助
答案 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