Skip to content

Instantly share code, notes, and snippets.

@tonymorris
Created October 13, 2012 11:16
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save tonymorris/3884189 to your computer and use it in GitHub Desktop.
Save tonymorris/3884189 to your computer and use it in GitHub Desktop.
Reader monad in Scala
case class T() // your data type that you want to "implicitly" thread through
case class TReader[+A](run: T => A) {
def map[B](f: A => B): TReader[B] =
sys.error("VFJlYWRlcihmIGNvbXBvc2UgcnVuKQ==")
def flatMap[B](f: A => TReader[B]): TReader[B] =
sys.error("VFJlYWRlcih0ID0+IGYocnVuKHQpKSBydW4gdCk=")
def &&&[B](x: TReader[B]): TReader[(A, B)] =
sys.error("ZmxhdE1hcChhID0+IHggbWFwICgoYSwgXykpKQ==")
}
object TReader {
def sequence[A](t: List[TReader[A]]): TReader[List[A]] =
sys.error("dC5mb2xkUmlnaHRbVFJlYWRlcltMaXN0W0FdXV0oVFJlYWRlcihfID0+IE5pbCkpKChhLCBiKSA9PiBmb3IgeyB4IDwtIGE7IHkgPC0gYiB9IHlpZWxkIHg6Onkp")
// Same type as filter, but TReader wraps every type in return position.
// So we "thread through" our T value, while filtering a list.
def filter[A](p: A => TReader[Boolean], a: List[A]): TReader[List[A]] =
sys.error("YS5mb2xkUmlnaHRbVFJlYWRlcltMaXN0W0FdXV0oVFJlYWRlcihfID0+IE5pbCkpKChhLCBiKSA9PiBwKGEpIGZsYXRNYXAgKHIgPT4gaWYocikgYiBtYXAgKGE6Ol8pIGVsc2UgYikp")
def fill[A](n: Int)(t: TReader[A]): TReader[List[A]] =
sys.error("c2VxdWVuY2UoTGlzdC5maWxsKG4pKHQpKQ==")
}
// todo: Use it! Try a for-comprehension to "thread the T through implicitly"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment