Swiftz
Swiftz 是一个用于函数式编程的 Swift 库。
它定义了函数式数据结构、函数、习惯用法和扩展,以增强 Swift 标准库。
要了解将函数式原语引入任何代码库的简单方式,请参阅 Swiftx。
介绍
Swiftz 从许多函数式库和语言中汲取灵感。其中最重要的包括 Scalaz、Prelude/Base、SML Basis 和 OCaml Standard Library。库的某些元素依赖于它们的组合语义,使得在 Swift 中更清晰地表达声明式思想。
Swiftz 是 Swiftx 的适当超集,实现了箭头、列表、HLists 和许多对类型系统支持最大化的类型类。
为了说明这些抽象的使用,请看以下示例
列表
import struct Swiftz.List
//: Cycles a finite list of numbers into an infinite list.
let finite : List<UInt> = [1, 2, 3, 4, 5]
let infiniteCycle = finite.cycle()
//: Lists also support the standard map, filter, and reduce operators.
let l : List<Int> = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let twoToEleven = l.map(+1) // [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
let even = l.filter((==0) • (%2)) // [2, 4, 6, 8, 10]
let sum = l.reduce(curry(+), initial: 0) // 55
//: Plus a few more.
let partialSums = l.scanl(curry(+), initial: 0) // [0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
let firstHalf = l.take(5) // [1, 2, 3, 4, 5]
let lastHalf = l.drop(5) // [6, 7, 8, 9, 10]
半群和幺半群
let xs = [1, 2, 0, 3, 4]
import protocol Swiftz.Semigroup
import func Swiftz.sconcat
import struct Swiftz.Min
//: The least element of a list can be had with the Min Semigroup.
let smallestElement = sconcat(Min(2), t: xs.map { Min($0) }).value() // 0
import protocol Swiftz.Monoid
import func Swiftz.mconcat
import struct Swiftz.Sum
//: Or the sum of a list with the Sum Monoid.
let sum = mconcat(xs.map { Sum($0) }).value() // 10
import struct Swiftz.Product
//: Or the product of a list with the Product Monoid.
let product = mconcat(xs.map { Product($0) }).value() // 0
箭头
import struct Swiftz.Function
import struct Swiftz.Either
//: An Arrow is a function just like any other. Only this time around we
//: can treat them like a full algebraic structure and introduce a number
//: of operators to augment them.
let comp = Function.arr(+3) • Function.arr(*6) • Function.arr(/2)
let both = comp.apply(10) // 33
//: An Arrow that runs both operations on its input and combines both
//: results into a tuple.
let add5AndMultiply2 = Function.arr(+5) &&& Function.arr(*2)
let both = add5AndMultiply2.apply(10) // (15, 20)
//: Produces an Arrow that chooses a particular function to apply
//: when presented with the side of an Either.
let divideLeftMultiplyRight = Function.arr(/2) ||| Function.arr(*2)
let left = divideLeftMultiplyRight.apply(.Left(4)) // 2
let right = divideLeftMultiplyRight.apply(.Right(7)) // 14
运算符
有关支持的运算符列表,请参阅 运算符。
设置
要将 Swiftz 添加到您的应用程序中
使用 Carthage
- 将 Swiftz 添加到您的 Cartfile 中
- 运行
carthage update
- 将Swiftz的相关副本拖入您的项目中。
- 展开“链接二进制与库”阶段
- 点击“+”并添加Swiftz
- 点击左上角的“+”来添加“复制文件”构建阶段
- 将目录设置为“Frameworks”
- 点击“+”并添加Swiftz
使用Git子模块
- 将Swiftz作为子模块克隆到您选择的目录中
- 运行命令
git submodule init -i --recursive
- 将
Swiftz.xcodeproj
或Swiftz-iOS.xcodeproj
作为子项目拖入您的项目树 - 在您的项目“构建阶段”下,展开“目标依赖项”
- 点击“+”并添加Swiftz
- 展开“链接二进制与库”阶段
- 点击“+”并添加Swiftz
- 点击左上角的“+”来添加“复制文件”构建阶段
- 将目录设置为“Frameworks”
- 点击“+”并添加Swiftz
使用Swift包管理器
- 在您项目的
Package.swift
内部添加Swiftz到“Package”定义中
let package = Package(
name: "MyProject",
...
dependencies: [
.package(url: "https://github.com/typelift/Swiftz.git", from: "0.0.0")
...
],
targets: [
.target(
name: "MyProject",
dependencies: ["Swiftz"]),
...
]
)
系统要求
Swiftz支持OS X 10.9+和iOS 8.0+
许可
Swiftz遵循BSD许可。