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

Getting the length of a list using combinators f#

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# 中)获取列表的长度,但我想知道如何使用组合器来完成这个确切的代码。如果有人能帮忙解决那就太好了,谢谢!

我假设你要的是

Seq.length list1

正如 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 是要走的路:-)。