Introducing Bow - Functional Programming for Swift
by Tomás Ruiz López
- •
- January 09, 2019
- •
- swift• functional• bow• arrow
- |
- 4 minutes to read.

The release of Arrow in early 2018, based on the joint efforts of the Kategory and funKTionale teams, eased the introduction of Functional Programming concepts in Kotlin. Developers can now benefit enormously from the advantages that FP brings to this language. Kotlin is mainly used for Android mobile development so the rise of Arrow prompted a reoccurring question from iOS developers; What about our Swift counterpart?
Today, we present an answer to that question. We are happy to announce Bow, a companion library to Swift Foundation that brings FP concepts into Swift. The library is available as an open source project on Github and has been designed to maximize similarity with Arrow. This way, Swift developers can take advantage of existing resources for Arrow and translate them to Bow with little effort.
Bow doesn’t have the same level of maturity as Arrow quite yet, nor the amount of features, but we will continue to invest in its growth in 2019. We appreciate and welcome contributions (of all levels) to help us make Bow the reference library for Functional Programming in Swift.
As of version 0.3.0, Bow is divided into multiple modules that can be imported upon convenience.
Bow
The Bow module is the core of the library and contains the following features:
- Higher Kinded Types emulation: Swift does not have native support for Higher Kinded Types, although the Generics Manifesto states it will in the future. However, we added support to begin with as it’s needed in the rest of the library. The emulation is simple, but adds a small amount of boilerplate that we are working to automate.
- Function manipulation utilities: operators for composing, currying, reversing, complementing, and memoizing functions are available as part of this module.
- Data types: the core module provides some useful data types like
Option
,Either
,Try
, andNonEmptyList
, as well as wrappers over types in Foundation, likeListK
andSetK
that enable using them as Higher Kinded Types. - Typeclasses and instances: definitions of usual typeclasses, like Functor, Monad, and Semigroup are part of this module. Also, instances for primitive types and the provided data types are available.
- Monad transformers: types like
StateT
andWriterT
are also offered in the core module.
The core module can be utilized with CocoaPods:
pod "Bow", "~> 0.3.0"
BowOptics
Utilities to work with immutable data structures such as Lenses, Prisms, and Traversals are part of the BowOptics module, which can be used with:
pod "BowOptics", "~> 0.3.0"
BowRecursionSchemes
Working with recursive data structures and F-algebras is easier with the BowRecursionSchemes module.
pod "BowRecursionSchemes", "~> 0.3.0"
BowFree
Create programs using a Free
monad and define its interpretation later to make
polymorphic programs with BowFree.
pod "BowFree", "~> 0.3.0"
BowResult
Easily integrate with the popular library Result
to convert from/to Bow’s data types to Result
. As many other libraries already
use Result as a return/input type, this can ease their interoperability with Bow.
pod "BowResult", "~> 0.3.0"
BowEffects
This module provides the IO
data type to encapsulate effects, as well as the necessary
typeclasses to work with effects in a polymorphic way.
pod "BowEffects", "~> 0.3.0"
BowRx
Instead of using IO
, users of RxSwift
can still use reactive data types with the corresponding encapsulations that we
provide in this module, namely ObservableK
, SingleK
, and MaybeK
, to make them
Higher Kinded Types.
pod "BowRx", "~> 0.3.0"
BowBrightFutures
Users of the library BrightFutures
can use the FutureK
wrapper that converts Future
into a Higher Kinded Type.
pod "BowBrightFutures", "~> 0.3.0"
The library can also be utilized using Carthage by adding this line to a Cartfile:
github "bow-swift/Bow" ~> 0.3.0
By adding this, separate frameworks will be built for each module that can be added to the project, based on your needs.
We would like to invite you to try Bow and give us your feedback. It will help us find out where the library can improve, and contribute towards making Swift a more functional programming language. Currently, we’re working on writing documentation and getting it ready for publication in the near future.
Please check out the following Bow resources. Comments and questions are welcome!
Bow is proudly sponsored by 47 Degrees, a Functional Programming consultancy with a focus on the Scala, Kotlin, and Swift Programming languages which supports the active development of Bow.