函数式编程之管道设计
函数式编程三大猛将
声明式
- 不用将具体处理过程自己重复实现
- 只暴露出一个传入可变规则的入口
- 减少代码量,简洁易理解
let objectOfCondition = objects.filter { object in
return object.value == condition
}
First-Class
- 闭包赋值给变量,传递给函数或作为返回值
- 这个闭包就是 First-Class
func filterCondition(object:Object) -> Bool {
return object.value == condition
}
object = objects.filter(filterCondition)
Curry
- 用函数生成另一个函数
- 对闭包作进一步抽象
func filterGenerator(condition: String) -> (Object) -> (Bool) {
return {object in
return object.value == condition
}
}
let filterCondition = filterGenerator(condition)
object = objects.filter(filterCondition)
返回一个 (Staff) -> (Bool) 这样签名格式的闭包,即入参为 Staff,输出为 Bool 的一个函数
其它应用
map
转换为另一种格式的结果
连环 map 示例:
let arr : [Int] = [1, 2, 4]
let brr : [String] = arr.map {
"N" + String($0)
}.map {
"o" + String($0)
}.map {
"." + String($0)
}
// brr = ["No.1", "No.2", "No.4"]
reduce
先给出初始值传入闭包,然后再将每次闭包的结果传入到下一次的闭包调用中,用于需要将每次结果或叠加或累计或关联的场景
函数式语言和逻辑式语言擅长基于数理逻辑的应用,命令式语言擅长基于业务逻辑的、尤其是交互式或事件驱动型的应用。
Swift 的 Curry 举例
传入一个函数到一个函数生成另一个函数:
func checkForError<A>(_ transform: @escaping ([String:String]) -> Result<A>) -> (Any) -> Result<A> {
return { response in
guard let json = response as? [String:String] else { return .error() }
return transform(json)
}
}
Swift 的管道
关于 JavaScript 的管道操作符
let url = "%21" |> decodeURI;
等价于
let url = decodeURI("%21");
(和KVO有点类似,KVO是新建一个类来包装需要被观察的对象,然后通过在新对象的didSet中向注册监听的对象发送变更消息,同时用新对象的didSet去hook掉原来对象的didSet方法而已,内部再调回原对象的didSet,而RxSwift就是通过一个Observable来包装要被观察的对象,然后也是向这个Observable去注册监听,)
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 mingfungliu@gmail.com
文章标题:函数式编程之管道设计
文章字数:610
本文作者:Mingfung
发布时间:2020-10-29, 12:35:00
最后更新:2020-11-06, 15:25:26
原始链接:http://blog.ifungfay.com/uncategorized/函数式编程之管道设计/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。