What is a monad?

前端 未结 30 1631
太阳男子
太阳男子 2020-11-30 13:39

Having briefly looked at Haskell recently, what would be a brief, succinct, practical explanation as to what a monad essentially is?

I have found most expla

30条回答
  •  鱼传尺愫
    2020-11-30 14:10

    In the context of Scala you will find the following to be the simplest definition. Basically flatMap (or bind) is 'associative' and there exists an identity.

    trait M[+A] {
      def flatMap[B](f: A => M[B]): M[B] // AKA bind
    
      // Pseudo Meta Code
      def isValidMonad: Boolean = {
        // for every parameter the following holds
        def isAssociativeOn[X, Y, Z](x: M[X], f: X => M[Y], g: Y => M[Z]): Boolean =
          x.flatMap(f).flatMap(g) == x.flatMap(f(_).flatMap(g))
    
        // for every parameter X and x, there exists an id
        // such that the following holds
        def isAnIdentity[X](x: M[X], id: X => M[X]): Boolean =
          x.flatMap(id) == x
      }
    }
    

    E.g.

    // These could be any functions
    val f: Int => Option[String] = number => if (number == 7) Some("hello") else None
    val g: String => Option[Double] = string => Some(3.14)
    
    // Observe these are identical. Since Option is a Monad 
    // they will always be identical no matter what the functions are
    scala> Some(7).flatMap(f).flatMap(g)
    res211: Option[Double] = Some(3.14)
    
    scala> Some(7).flatMap(f(_).flatMap(g))
    res212: Option[Double] = Some(3.14)
    
    
    // As Option is a Monad, there exists an identity:
    val id: Int => Option[Int] = x => Some(x)
    
    // Observe these are identical
    scala> Some(7).flatMap(id)
    res213: Option[Int] = Some(7)
    
    scala> Some(7)
    res214: Some[Int] = Some(7)
    

    NOTE Strictly speaking the definition of a Monad in functional programming is not the same as the definition of a Monad in Category Theory, which is defined in turns of map and flatten. Though they are kind of equivalent under certain mappings. This presentations is very good: http://www.slideshare.net/samthemonad/monad-presentation-scala-as-a-category

提交回复
热议问题