List F#获取配对列表并返回一对

List F#获取配对列表并返回一对,list,f#,fst,List,F#,Fst,尝试获取对的列表并返回一个x值乘以y值的对:ex: mult[(x,y);(x,y);(x,y)]将是(xxx,yyy) mult[(1,2);((1,2);(1,2)]将返回(1,8) 尝试使用map fst而不是递归来实现这一点 目前我的代码是: let mult li = match li with map fst li 对f#来说是相当陌生的,如果我理解正确,你有一个2元组的数字列表,你想返回一个2元组,其中第一个元素表示列表中所有第一个元素的乘积,第二个元素同样表示列表中所

尝试获取对的列表并返回一个x值乘以y值的对:ex: mult[(x,y);(x,y);(x,y)]将是(xxx,yyy) mult[(1,2);((1,2);(1,2)]将返回(1,8)

尝试使用map fst而不是递归来实现这一点 目前我的代码是:

let mult li = 
    match li with map fst li

对f#

来说是相当陌生的,如果我理解正确,你有一个2元组的数字列表,你想返回一个2元组,其中第一个元素表示列表中所有第一个元素的乘积,第二个元素同样表示列表中所有第二个元素的乘积。对吗

最简单的方法可能是:

let mult li = 
    let a,b = List.unzip li
    let product = List.fold (*) 1
    (product a, product b)
let mult li = 
    let a = List.map fst li
    let b = List.map snd li
    let product = List.fold (*) 1
    (product a, product b)
据我所知,默认情况下,F#不包含List.product高阶函数,因此为了方便起见,我创建了一个。关于此product函数,需要注意的一点是,如果在空列表上调用它,它将返回1(因为1是它的起始值)。如果您需要其他行为,最好在列表上进行模式匹配,并在正常列表上进行折叠,但在空列表上返回默认值。您可以使用
list.reduce(*)
,但这将在空列表上引发异常

用输入[(1,2);(1,2);(1,2)]在FSI中测试,得到结果(1,8)

如果您想使用
fst
snd
功能,那么您可以将其修改为如下内容:

let mult li = 
    let a,b = List.unzip li
    let product = List.fold (*) 1
    (product a, product b)
let mult li = 
    let a = List.map fst li
    let b = List.map snd li
    let product = List.fold (*) 1
    (product a, product b)
但是List.unzip非常简单(而且可能更有效,因为我认为它只需要在列表上迭代一次)

您可以:
List.reduce(fun x y->((fst x*fst y),(snd x*snd y)))li