Live data from Hacker News

Functor and Monad in Swift

javiersoto.me

1–10 of 20 posts

Re: Functor and Monad in Swift

#2
This is a great article. It captures the essence of functors and monads in programming really well without the usual nonsensical analogies from other similar tutorials.

There 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

#3
Nice 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 always be returned.

Re: Functor and Monad in Swift

#5

Nice 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…

I'm not familiar with swift, but in Haskell, you can't write the following:

    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

#9
post #4

Is there return type polymorphism in Swift? Without it monad-generic operations are limited.

Yes.

  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

#10
This is an excellent article, I think it explains the monad pretty simply, starting from an understanding of functors.

For 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...

Post reply on HN