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#中)获得列表的长度,但是我想知道如何使用组合器来完成此精确代码。如果有人可以帮忙,那就太好了,谢谢!
答案 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