F# - 使用累加器映射列表

时间:2014-03-12 12:24:47

标签: f#

我是F#和函数式编程的新手。给定一个场景,您希望迭代序列或字符串列表,并将其映射到不同类型的新列表,使用累加器,什么是正确的函数方法?我可以使用可变变量在F#中实现这一点,但我很难找到适合这个的函数。它与我认为的地图类似,但有国家的概念。

换句话说,我想将一个字符串列表转换为一个win表单单选按钮列表,但是对于每个新按钮,我想将20添加到前一个y坐标。类似的东西:

new RadioButton(Text=str,Location=new Point(20,y+20),Width=350)

3 个答案:

答案 0 :(得分:15)

您可以使用List.fold

open System.Drawing
open System.Windows.Forms

let getButtons () =
    let strings = ["a"; "b"; "c"]
    let (_, pointsRev) = List.fold (fun (offset, l) s -> (offset+20, (new RadioButton(Text=s, Location = new Point(20, offset), Width = 350))::l)) (0, []) strings
    pointsRev |> List.rev

状态是包含当前偏移量和当前输出列表的对。输出列表以相反的顺序构建,因此必须在最后反转。

您也可以使用Seq.map2:

let points = Seq.map2 (fun offset s -> new RadioButton(Text=s, Location = new Point(20, offset)) (Seq.initInfinite ((*)20)) strings |> List.ofSeq

答案 1 :(得分:3)

您可以通过引用访问和更改变量

let x = ref 0
x := !x + 5
new Point(20,!x+20)

你可以在闭包内使用这样的变量。

您也可以使用mapihttp://msdn.microsoft.com/en-us/library/ee353425.aspx

并根据i new Point(20,i*20+20)

添加y值

答案 2 :(得分:1)

使用b.categories << Category order_by(:created_at => 'asc').first b.categories << Category order_by(:created_at => 'asc').last 是一个好主意(请参阅接受的答案)。

作为一个F#初学者,我将折叠分成一个单独的函数并重命名一些变量,这样我就能更清楚地理解它。这似乎有效:

List.fold