我想向列表中添加一个元素。元素将在 for 循环内创建。我目前拥有的是
let MaxCubeVolume tpList =
let list1 = []
printfn "%A" list1
for l,w,h in tpList do
let vol = CubeVolume l w h
let list = vol::list1
printfn "%A" list
Run Code Online (Sandbox Code Playgroud)
其中 list1 是我要添加到的主列表,而 list 是我要用来添加到该列表的内容。CubeVolume 正在工作,它需要 3 个浮点数并返回一个立方体的体积。tpList 是包含 3 个浮点数的元组列表。我迷路的地方是如何将 vol 添加到主列表中?
F# 列表是不可变的。你不能“改变”它们。您不会向它们“添加”元素。您只能从旧列表中创建一个新列表(但旧列表保持不变并且仍然可用)。
但这是函数式编程的错误思维框架。在函数式编程中,您不会通过反复修改数据结构来计算结果。相反,您可以从较小的数据结构中组合较大的数据结构,或者通过使用(并组合)为您执行此操作的原始函数。
特别是,如果您有一个假设的三元组列表,并且您有一个函数可以将一个这样的三元组转换为假设的数字,并且您想让自己列出这些数字 -这是一个非常著名的原始操作,称为map:
let tripleToNumber (l, w, h) = CubeVolume l w h
let list1 = List.map tripleToNumber tpList
Run Code Online (Sandbox Code Playgroud)
或者您可以内联指定转换函数,而无需为其指定单独的名称:
let list1 = List.map (fun (l, w, h) -> CubeVolume l w h) tpList
Run Code Online (Sandbox Code Playgroud)
然后你可以使用|>运算符重新排列 的参数List.map,只是为了让它看起来更好一点:
let list1 = tpList |> List.map (fun (l, w, h) -> CubeVolume l w h)
Run Code Online (Sandbox Code Playgroud)
或者,或者,您可以使用 F# 列表推导式,它们是语法糖:它们在幕后做同样的事情,但有一个(可以说)更好的外观:
let list1 = [for (l, w, h) in tpList -> CubeVolume l w h]
Run Code Online (Sandbox Code Playgroud)
这里需要注意的重要一点是,上述代码段实际上都没有改变任何数据。它们都通过转换旧数据来生成新数据。
| 归档时间: |
|
| 查看次数: |
366 次 |
| 最近记录: |