【发布时间】:2012-08-03 17:04:07
【问题描述】:
我正在阅读Why functional programming matters,其中作者使用 foldr 和函数组合实现了几个应用程序。我在 F# 中做了其中的一些,例如地图功能:
let cons a lst = a::lst
let map f lst = List.foldBack (f>>cons) lst []
然后我想实现列表过滤功能,结果卡住了:
let filter pred lst = List.foldBack (what-goes-here?) lst []
what-goes-here? 函数应该将列表项、累积过滤列表作为输入,如果谓词返回 false,则返回相同的列表,如果返回 true,则返回 cons:ed 列表.
我想我在这里需要选项类型,但不知道如何将它们粘合在一起。 是否可以使用 pred 和 cons(可能还有其他一些原语)来编写一个函数来实现这个而不编写一个自定义的 lambda 函数来完成所有的工作?这是计算表达式的情况吗?
【问题讨论】:
-
不写 lambda 有什么意义?毫无意义,原谅,无意义的风格?这显然适用于纯代码:
fun x xs -> if f x then x :: xs else xs。请注意,它与List.filter的不同之处在于存在副作用,List.foldBack则不合适。 -
谢谢。关键是我想了解更多关于 fp 的一般知识,在这种情况下是函数组合。为什么它与
List.filter存在副作用不同? -
@Christian:因为您正在反向遍历列表 (
foldBack),所以您的副作用将以相反的顺序发生。 (例如,打印列表) -
@Christian - 它非常隐蔽 - github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/… 在第 163 行
-
@bytebuster,也许您描述的属性是linear(如linear logic),而不是monadic。无论如何,你的说法是不正确的。给定一个合适的基,例如 SKI 基,可以在没有 lambda 绑定器的情况下表达这个函数。
标签: f# functional-programming pointfree