What are practical uses of applicative style?

后端 未结 11 684
误落风尘
误落风尘 2021-01-30 01:32

I am a Scala programmer, learning Haskell now. It\'s easy to find practical use cases and real world examples for OO concepts, such as decorators, strategy pattern etc. Books an

11条回答
  •  情歌与酒
    2021-01-30 01:59

    I think of Functor, Applicative and Monad as design patterns.

    Imagine you want to write a Future[T] class. That is, a class that holds values that are to be calculated.

    In a Java mindset, you might create it like

    trait Future[T] {
      def get: T
    }
    

    Where 'get' blocks until the value is available.

    You might realize this, and rewrite it to take a callback:

    trait Future[T] {
      def foreach(f: T => Unit): Unit
    }
    

    But then what happens if there are two uses for the future? It means you need to keep a list of callbacks. Also, what happens if a method receives a Future[Int] and needs to return a calculation based on the Int inside? Or what do you do if you have two futures and you need to calculate something based on the values they will provide?

    But if you know of FP concepts, you know that instead of working directly on T, you can manipulate the Future instance.

    trait Future[T] {
      def map[U](f: T => U): Future[U]
    }
    

    Now your application changes so that each time you need to work on the contained value, you just return a new Future.

    Once you start in this path, you can't stop there. You realize that in order to manipulate two futures, you just need to model as an applicative, in order to create futures, you need a monad definition for future, etc.

    UPDATE: As suggested by @Eric, I've written a blog post: http://www.tikalk.com/incubator/blog/functional-programming-scala-rest-us

提交回复
热议问题