functional-programming - 应用转换以组合列表中的某些项目

标签 functional-programming f#

我想知道如何在 F# 中应用以下转换。

我发现它与折叠类似,因为我需要先前和当前的值来做出决定,但折叠输出不是列表,而是计算状态。

我知道如何以命令式方式执行此操作,但我想知道如何以函数式思维方式执行此操作。

谢谢

let a = [ "1"; "2"; "3"; "A"; "4"; "5"; "B" ]

// if value = "A" or "B", combine with previous value

let expectedResults = [ "1"; "2"; "3A"; "4"; "5B"; ]

最佳答案

从右到左进行操作可能是最简单的,这样您就不必在折叠后反转列表:

let combineLettersWithPreviousValues ss =
    let folder x = function
        | [] -> [x]
        | h :: t -> if h = "A" || h = "B" then x + h :: t else x :: h :: t
    List.foldBack folder ss []

尽管如此,它仍然是一个折叠,只是一个右折叠...

> combineLettersWithPreviousValues [ "1"; "2"; "3"; "A"; "4"; "5"; "B" ];;
val it: string list = ["1"; "2"; "3A"; "4"; "5B"]

此技术可推广到任何列表序列(而不仅仅是字符串列表),并且只需要一次传递并且不需要列表串联(仅列表cons(:: ))。

关于functional-programming - 应用转换以组合列表中的某些项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75643115/

相关文章:

java - Scala 的 flatMap 的 Guava 等价物是什么?

dynamic - 为什么 Clojure 是动态类型的?

f# - 解析括号表达式

f# - 如何将函数应用于 float 组的数组?

c# - C#、F#、IronPython 和 IronRuby 的集成

function - 如何在 Haskell 的树之间移动子树?

functional-programming - 什么是 "reduction semantics"?请用外行术语解释PLT Redex的用法

java - 在 Java 中将方法标记为纯函数的约定

algorithm - 寻找算法来寻找参数以满足给定函数的返回

mvvm - 是否可以在 F# 中将 INotifyPropertyChanged 实现为类型扩展