F# 取一对列表和 return 一对
F# take a list of pairs and return a pair
尝试获取成对列表和 return 成对,即 x 值乘以 y 值的乘积:例如:
mult [(x,y);(x,y);(x,y)] 将是 (xxx,yyy )
mult [(1,2);((1,2);(1,2)] 会 return (1,8)
尝试使用 map fst 并且不使用递归来做到这一点
目前我的代码是:
let mult li =
match li with map fst li
对 f# 相当陌生
如果我没理解错的话,你有一个数字二元组列表,你想要 return 一个二元组,其中第一个元素代表所有第一个元素的乘积列表的元素,第二个元素同样表示列表的所有第二个元素的乘积。正确吗?
最简单的方法可能是这样的:
let mult li =
let a,b = List.unzip li
let product = List.fold (*) 1
(product a, product b)
据我所知,默认情况下 F# 不包含 List.product 高阶函数,因此为方便起见我创建了一个。关于此乘积函数需要注意的一件事是,如果在空列表上调用它,它将 return 1(因为 1 是它的起始值)。如果您需要替代行为,最好的办法是在列表上进行模式匹配并在普通列表上进行折叠,但 return 是空列表上的默认值。您可以使用 List.reduce (*)
,但那样会在空列表上引发异常。
在 FSI 中使用输入 [(1,2);(1,2);(1,2)] 对此进行测试,我得到结果 (1,8)。
如果您想使用 fst
和 snd
函数,则可以将其修改为:
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 虽然更简单(而且可能更有效,因为我认为它只需要遍历列表一次)
尝试获取成对列表和 return 成对,即 x 值乘以 y 值的乘积:例如: mult [(x,y);(x,y);(x,y)] 将是 (xxx,yyy ) mult [(1,2);((1,2);(1,2)] 会 return (1,8)
尝试使用 map fst 并且不使用递归来做到这一点 目前我的代码是:
let mult li =
match li with map fst li
对 f# 相当陌生
如果我没理解错的话,你有一个数字二元组列表,你想要 return 一个二元组,其中第一个元素代表所有第一个元素的乘积列表的元素,第二个元素同样表示列表的所有第二个元素的乘积。正确吗?
最简单的方法可能是这样的:
let mult li =
let a,b = List.unzip li
let product = List.fold (*) 1
(product a, product b)
据我所知,默认情况下 F# 不包含 List.product 高阶函数,因此为方便起见我创建了一个。关于此乘积函数需要注意的一件事是,如果在空列表上调用它,它将 return 1(因为 1 是它的起始值)。如果您需要替代行为,最好的办法是在列表上进行模式匹配并在普通列表上进行折叠,但 return 是空列表上的默认值。您可以使用 List.reduce (*)
,但那样会在空列表上引发异常。
在 FSI 中使用输入 [(1,2);(1,2);(1,2)] 对此进行测试,我得到结果 (1,8)。
如果您想使用 fst
和 snd
函数,则可以将其修改为:
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 虽然更简单(而且可能更有效,因为我认为它只需要遍历列表一次)