F#从两个列表中生成配对列表
我需要在F#中创建一个函数,将两个列表中的元素配对在一起(请参见下图(ii)): 实际上,我并不完全确定问题是什么:我是否需要创建一个函数,该函数接受两个列表并返回一个对列表,其中结果列表中的第I个元素是一对,其中对中的第一个元素是第一个列表中的第I个元素,对中的第二个元素是第二个列表中的第I个元素?我不明白F#从两个列表中生成配对列表,f#,F#,我需要在F#中创建一个函数,将两个列表中的元素配对在一起(请参见下图(ii)): 实际上,我并不完全确定问题是什么:我是否需要创建一个函数,该函数接受两个列表并返回一个对列表,其中结果列表中的第I个元素是一对,其中对中的第一个元素是第一个列表中的第I个元素,对中的第二个元素是第二个列表中的第I个元素?我不明白*在val-pairlists:'a list*'b list->('a*'b)list 如果这就是我应该做的,那么下面就是我尝试过的: let pairlists (l : 'a list
*
在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)
]
let配对列表(l:a列表)(m:b列表)=
如果l.长度m.长度那么
failwith“两个列表的大小不同”
其他的
[对于1..l.长度中的i
收益率(长水头、米水头)
]
我不知道该怎么做,因为我不知道如何遍历列表?
帮助您可以通过模式匹配来迭代列表,这是使用
匹配。。。使用
表达式
例如:
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
现在,您需要做的就是决定这四种情况下函数的结果应该是什么,然后写下来
我不会给你完整的答案,因为这显然是家庭作业,但这里有另一个提示:配对两个非空列表意味着配对头(即第一个元素),然后配对尾,然后将两者连接在一起。函数签名中的
*
表示输入是两个列表的元组,输出是元组列表。
实现这一点的最简单方法是使用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
,尽管它可能是家庭作业。这就是说,他们确实明确指出,列表的大小应该相同,因为在使用zip
时,其他任何内容都应该提供更有力的建议。