如何在F#中操作列表元素

是0

我目前正在使用F#完成一个项目。我对函数式编程非常陌生,尽管我熟悉列表项是不可变的,但仍然存在一些问题:

我有一个格式的字符串列表

["(states, (1,2,3,4,5))"; "(alpha, (1,2))"; "(final, (1))"]

我想做的是将每个列表元素转换成自己的列表,而无需使用逗号分隔字符串。输出应如下所示:

["1"; "2"; "3"; "4"; "5"]
["1"; "2"]
["1"]

我发现了无数种连接列表元素的方法,到目前为止,我的最佳猜测(正在展开或类似的尝试)是徒劳的。任何帮助或朝着正确方向的观点将不胜感激。谢谢!

马克·西曼

您可以使用.NET中的内置字符串处理API来实现此目的您不必特别花哨,但可以帮助通过stringAPI提供一些苗条的咖喱适配器

open System

let removeWhitespace (x : string) = x.Replace(" ", "")

let splitOn (separator : string) (x : string) =
    x.Split([| separator |], StringSplitOptions.RemoveEmptyEntries)

let trim c (x : string) = x.Trim [| c |]

唯一棘手的步骤是一旦您习惯splitOn拆分"(states, (1,2,3,4,5))"[|"(states"; "1,2,3,4,5))"|]现在,您有一个包含两个元素的数组,并且需要第二个元素。您可以通过以下方法进行操作:首先获取Seq.tail该数组,丢弃第一个元素,然后获取Seq.head结果序列,为您提供剩余序列的第一个元素。

使用这些构造块,您可以像这样提取所需的数据:

let result =
    ["(states, (1,2,3,4,5))"; "(alpha, (1,2))"; "(final, (1))"]
    |> List.map (
        removeWhitespace
        >> splitOn ",("
        >> Seq.tail
        >> Seq.head
        >> trim ')'
        >> splitOn ","
        >> Array.toList)

结果:

val result : string list list = [["1"; "2"; "3"; "4"; "5"]; ["1"; "2"]; ["1"]]

最不安全的部分是Seq.tail >> Seq.head组合。如果输入列表中的元素少于两个,则失败。一种更安全的替代方法是使用类似以下trySecond帮助器函数的方法:

let trySecond xs =
    match xs |> Seq.truncate 2 |> Seq.toList with
    | [_; second] -> Some second
    | _ -> None

使用此功能,您可以重写数据提取功能,使其更强大:

let result' =
    ["(states, (1,2,3,4,5))"; "(alpha, (1,2))"; "(final, (1))"]
    |> List.map (removeWhitespace >> splitOn ",(" >> trySecond)
    |> List.choose id
    |> List.map (trim ')' >> splitOn "," >> Array.toList)

结果与以前相同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在F#中递归地添加列表中的所有元素?

来自分类Dev

如何在F#中递归地添加列表中的所有元素?

来自分类Dev

如何从列表中删除元素列表(F#)

来自分类Dev

如何在f#中的列表中解开并集值

来自分类Dev

如何在F#中合并Result <>的列表?

来自分类Dev

如何在F#的列表中仅保留“稳定”值

来自分类Dev

如何在F#中合并Result <>的列表?

来自分类Dev

如何在F#中获取子列表或子序列

来自分类Dev

如何在 F# 中创建可为空的列表?

来自分类Dev

如何在更新操作中显示选定的列表元素?

来自分类Dev

如何在F#中对元组中的“任何三个元素”求和

来自分类Dev

如何在F#中以自己定义的类型正确访问元素

来自分类Dev

在string []列表中列出一个元素f#

来自分类Dev

在F#中打印树列表元组元素

来自分类Dev

在F#中计算列表中未更改的元素数

来自分类Dev

在F#中打印树列表元组元素

来自分类Dev

如何在F#中合并数组

来自分类Dev

如何在F#中遍历String [] []

来自分类Dev

IO操作如何在F#上运行

来自分类Dev

如何操作嵌套列表中的NULL元素?

来自分类Dev

如何在F#中编写有效的列表/序列函数?(mapFoldWhile)

来自分类Dev

如何在F#中索引自己定义的列表类型

来自分类Dev

如何在f#中的可变列表中编辑项目,并允许列表中的其他项目保留其值?

来自分类Dev

如何在F#中将元组序列化为列表?

来自分类Dev

如何在F#元组列表中正确键入注释

来自分类Dev

F# - 如何方便地将列表中的元素应用于柯里化函数的参数?

来自分类Dev

如何在列表中操作矩阵?

来自分类Dev

F#中的嵌套列表

来自分类Dev

如何串联F#中的列表(和其他集合)?

Related 相关文章

热门标签

归档