我想知道如何在 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/