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

时间:2018-11-05 19:25:11

标签: list f# fst

尝试获取对的列表并返回一个对,该对是x值乘以y值的倍数:例如: 多[[x,y);(x,y);(x,y)]为(x x x,y y y) 多[(1,2);((1,2,;; 1,2)]将返回(1,8)

尝试使用地图fst执行此操作,并且不进行递归 目前我的代码是:

let mult li = 
    match li with map fst li

f#的新手

1 个答案:

答案 0 :(得分:4)

如果我对您的理解正确,那么您将获得一个由2个元组组成的列表,并且希望返回一个2个元组,其中第一个元素代表列表中所有第一个元素的乘积,并且第二个元素同样表示列表中所有第二个元素的乘积。是吗?

最简单的方法可能是:

let mult li = 
    let a,b = List.unzip li
    let product = List.fold (*) 1
    (product a, product b)

据我所知,F#默认不包含List.product高阶函数,因此为方便起见,我创建了一个。关于此乘积函数要注意的一件事是,如果在一个空列表上调用它将返回1(因为1是它的起始值)。如果您需要其他行为,则最好的办法是在列表上进行模式匹配,然后在常规列表上进行折叠,但在空列表上返回默认值。您可以使用List.reduce (*),但这会在一个空列表上引发异常。

在FSI中使用输入[[1,2,;(1,2);(1,2)]进行测试,得出结果(1,8)。

如果您想使用fstsnd函数,则可以将其修改为:

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虽然简单得多(并且可能更有效,因为我认为它只需要遍历列表一次)