[英]F# take a list of pairs and return a pair
尝试获取对的列表并返回一个对,该对是x值乘以y值的倍数:例如:mult [(x,y);(x,y);(x,y)]将为(x x x,y y y)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)
据我所知,F#默认不包含List.product高阶函数,因此为方便起见,我创建了一个。 关于此乘积函数要注意的一件事是,如果在一个空列表上调用它将返回1(因为1是它的起始值)。 如果您需要其他行为,则最好的办法是在列表上进行模式匹配,然后在常规列表上进行折叠,但在空列表上返回默认值。 您可以使用List.reduce (*)
,但这会在一个空列表上引发异常。
用输入[[1,2,;; 1,2,;;(1,2)]在FSI中进行测试,得出结果(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简单得多(并且可能更有效,因为我认为它只需要遍历列表一次)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.