Functor and Monad in Swift
javiersoto.me
Functor and Monad in Swift
1–10 of 20 posts
Re: Functor and Monad in Swift
#2There are just a few tiny pieces missing from the puzzle: the functor and monad laws. They're pretty straight-forward - one would think they're common sense.
For functor, there is the mapping with identity law:
functor.map({ $0 }) == functor
which says that mapping the identity function over a functor results with a value equal to the one we started with
and the law for compositionality
functor.map({ f2(f1($0)) }) == functor.map(f1).map(f2)
which states that mapping a composite function yields the same result as mapping the first function then mapping the second function onto the result of the first map.
For monad, there are 3 additional laws (left identity, right identity and associativity).
Re: Functor and Monad in Swift
#3Minor question/comment regarding the implementation of Result.map: Why do you create a new Result in the error case? Result is immutable (or am I missing something specific to Swift here?), so the old and new Result are the same and stay that way.
I'm not familiar with the internals of Swift, but e.g. in Scala, there is only one "None". If you call map or flatMap on it, the same None will always be returned.
Re: Functor and Monad in Swift
#4Re: Functor and Monad in Swift
#5Nice article, well done! Minor question/comment regarding the implementation of Result.map: Why do you create a new Result in the error case? Result is immutable (or am I missing something specific to Swift here?), so the old and new Result are the same and stay that way. I'm not familiar with the internals of Swift, but e.g. in Scala, there is only one "None". If you call map or flatMap on it, the same None will alw…
flatMap :: Either e a -> (a -> Either e b) -> Either e b
flatMap x f =
case x of
Left _ -> x
Right x' -> f x'
In the case expression, you have to write `Left err -> Left err`, because `x` here has the type `Either e a`, but `Either e b` is expected.Re: Functor and Monad in Swift
#6http://www.h4labs.com/dev/ios/swift.html?q=functional&age=10...
Re: Functor and Monad in Swift
#7Re: Functor and Monad in Swift
#8Re: Functor and Monad in Swift
#9Is there return type polymorphism in Swift? Without it monad-generic operations are limited.
func f()->Bool {
return true
}
func f()->Int {
return 5
}
let i:Int = f()
let b:Bool = f()
println(i) // Prints 5
println(b) // Prints true
// This would be compile error as ambiguous
//println(f())Re: Functor and Monad in Swift
#10For those that are struggling with understanding (or feeling like you understand) monads, here are some articles like this one that I found very useful (note that the links are for haskell, but obviously, monads are a generally applicable concept).
A visual explanation of monads:
http://adit.io/posts/2013-04-17-functors,_applicatives,_and_...
The chapters on Functors, Applicatives, and Monoids that leads up to the chapter on monads (read the functors, applicatives, and monoids chapter first THEN the monad chatper and things will start to make sense):
http://learnyouahaskell.com/functors-applicative-functors-an...