函数式编程之管道设计

函数式编程三大猛将

声明式

  • 不用将具体处理过程自己重复实现
  • 只暴露出一个传入可变规则的入口
  • 减少代码量,简洁易理解
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" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏

宝贝回家