Advertisement
Guest User

Untitled

a guest
Dec 19th, 2019
456
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 0.84 KB | None | 0 0
  1. trait Functor[F[_]]
  2.   def [A,B](a : F[A]) map(func : A => B) : F[B]
  3.  
  4. trait Monad[F[_] : Functor]
  5.   def [A](a : A) identity : F[A]
  6.   def [A](mma : F[F[A]]) flatten : F[A]
  7.   def [A,B](ma : F[A]) flatMap(func : A => F[B]) : F[B] =
  8.     ma map func flatten
  9.  
  10. enum Maybe[T]
  11.   case Some(t : T)
  12.   case Empty()
  13.  
  14. object Maybe
  15.  
  16.   given Functor[Maybe]
  17.  
  18.     def [A,B](ma : Maybe[A]) map(func : A => B) : Maybe[B] =
  19.       ma match
  20.         case Maybe.Empty() => Maybe.Empty()
  21.         case Maybe.Some(a) => Maybe.Some(func(a))
  22.  
  23.   given Monad[Maybe]
  24.  
  25.     def [A](a : A) identity : Maybe[A] = Maybe.Some(a)  
  26.  
  27.     def [A] (mma : Maybe[Maybe[A]]) flatten : Maybe[A] =
  28.       mma match
  29.         case Maybe.Empty()  => Maybe.Empty()
  30.         case Maybe.Some(ma) => ma
  31.      
  32.  
  33. @main def m = println(Maybe.Some("a").flatMap(_ => Maybe.Some("b")))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement