我是F#和函数式编程的新手。给定一个场景,您希望迭代序列或字符串列表,并将其映射到不同类型的新列表,使用累加器,什么是正确的函数方法?我可以使用可变变量在F#中实现这一点,但我很难找到适合这个的函数。它与我认为的地图类似,但有国家的概念。
换句话说,我想将一个字符串列表转换为一个win表单单选按钮列表,但是对于每个新按钮,我想将20添加到前一个y坐标。类似的东西:
new RadioButton(Text=str,Location=new Point(20,y+20),Width=350)
答案 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)
你可以在闭包内使用这样的变量。
您也可以使用mapi
:http://msdn.microsoft.com/en-us/library/ee353425.aspx
并根据i
new Point(20,i*20+20)
答案 2 :(得分:1)
使用b.categories << Category order_by(:created_at => 'asc').first
b.categories << Category order_by(:created_at => 'asc').last
是一个好主意(请参阅接受的答案)。
作为一个F#初学者,我将折叠分成一个单独的函数并重命名一些变量,这样我就能更清楚地理解它。这似乎有效:
List.fold