使用组合器f#获取列表的长度

时间:2018-11-04 19:32:07

标签: f# combinators

let length (l : 'a list) =
  let mutable counter = 0
  for i in l do
    counter <- counter + 1
  counter

let list1 = [ 10; 25; 34; 45; 78 ]
length list1

我可以使用上面的代码(在F#中)获得列表的长度,但是我想知道如何使用组合器来完成此精确代码。如果有人可以帮忙,那就太好了,谢谢!

2 个答案:

答案 0 :(得分:1)

正如Vidas所提到的,您可以只使用内置的List.length函数,这是实践中最好的方法。但是,如果您对更多选项感兴趣,则基本的替代方法是使用递归:

let rec length l = 
  match l with 
  | [] -> 0
  | x::xs -> 1 + (length xs)

这不是使用组合器编写的,但这是一种基本的功能模式。函数的常规模式由fold函数捕获,您可以(基本)指定模式匹配的两个分支。使用fold,您可以编写:

let list1 = [ 10; 25; 34; 45; 78 ]
List.fold (fun s x -> s + 1) 0 list1

这表示初始状态为0,对于每个元素,我们将状态s增加1-这样结果将是列表的长度。

如果您想做一些完全疯狂的事情,则可以尝试将函数fun s x -> s + 1替换为使用组合器组成的函数。这将使您的代码不可读(任何人都不应这样做),但是思考如何做到这一点很有趣。您可能需要一个带有一个函数,两个参数并将两个参数作为元组传递给该函数的辅助函数:

let tuple f = fun a b -> f (a, b)

现在,您可以编写类似下面的代码的内容-尽可能多地使用组合器样式,但是很难解密。

List.fold (tuple (fst >> (+) 1)) 0 list1

因此,List.length是必经之路:-)。

答案 1 :(得分:0)

我认为您正在要求

Seq.length list1