【问题标题】:F# take a list of pairs and return a pairF# 获取对列表并返回一对
【发布时间】:2018-11-05 19:25:11
【问题描述】:

试图获取一个对列表并返回一个 x 值乘以 y 值的对:例如: 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# 相当陌生

【问题讨论】:

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

标签: list f# fst


【解决方案1】:

如果我的理解正确,您有一个 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 更简单(而且可能更高效,因为我认为它只需要遍历列表一次)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多