如何在f#函数列表中迭代每个项目一次?

时间:2017-05-10 18:57:32

标签: f# functional-programming

嗨我想知道是否有一种方法可以在列表中迭代每个项目一次,在java中我将使用a来为每个循环访问arraylist中的每个项目,但是我想采用f#的功能方法。我能想到的最好的方法是使用列表头部的第一个项目,然后删除它,这样下一个项目就是头部(然后继续进行,直到列表中没有剩下的值)。唯一的问题是我不知道如何实现它,因为我仍然是这种语言的新手。任何帮助将不胜感激。

为方便起见,假设我有一个列表:

let mylist = ["hello";"bird";"dog";"cat";"snake"]

1 个答案:

答案 0 :(得分:3)

惯用语

如果您只想在常规F#代码中执行此操作,而不是出于教育目的,则最简单的选择是使用for。这不是特别有用,但由于任务本质上是必不可少的,所以这是要走的路:

for item in mylist do
  printfn "%s" item

高阶函数

更具功能性的解决方案是使用更高阶函数List.iter。这作为较长流水线的一部分很有用,但它说明了一些功能特性,即使用函数作为参数:

mylist |> List.iter (fun item ->
  printfn "%s" item)

递归版

最后,您还可以使用列表上的递归和模式匹配来完成此操作。这基本上是List.iter在幕后所做的事情 - 而不是"删除"头部,这将列表分解为头部和尾部,然后在头部打印项目后递归处理尾部:

let rec iter items = 
  match items with
  | [] -> ()
  | head::tail -> 
     printfn "%s" head
     iter tail

iter mylist