Swiftz 0.8.0

Swiftz 0.8.0

测试已测试
Lang语言 SwiftSwift
许可证 BSD-3-Clause
发布最新发布2019年3月
SPM支持 SPM

Robert Widmann 维护。



Swiftz 0.8.0

  • CodaFi 和 pthariensflame

Carthage compatible Build Status Gitter chat

Swiftz

Swiftz 是一个用于函数式编程的 Swift 库。

它定义了函数式数据结构、函数、习惯用法和扩展,以增强 Swift 标准库。

要了解将函数式原语引入任何代码库的简单方式,请参阅 Swiftx

介绍

Swiftz 从许多函数式库和语言中汲取灵感。其中最重要的包括 ScalazPrelude/BaseSML BasisOCaml 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.xcodeprojSwiftz-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许可。