尝试获取对的列表并返回一个对,该对是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#的新手
答案 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)。
如果您想使用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虽然简单得多(并且可能更有效,因为我认为它只需要遍历列表一次)