使用组合器 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
是要走的路:-)。
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
是要走的路:-)。