MonadError in cats has the following laws:
- L1:
handle(raise(e))(f) == f(e) - L2:
pure(a) >>= (_ => raise(e)) == raise(e) - L3:
raise(e) >>= (_ => point(a)) == raise(e)
And it is defined roughly like this:
trait MonadError[F[_], E] {| class A { | |
| [Patch(New = true)] | |
| private int newField; | |
| [Patch(AccessRights = true)] | |
| public int privateField; | |
| public int Method1(int x); | |
| [Patch(Name = "Method1")] | |
| public int Method1Patch(int x) { |
| public void Match(AssemblyDefinition first, AssemblyDefinition second) | |
| { | |
| Contract.Requires<ArgumentNullException>(first != null); | |
| Contract.Requires<ArgumentNullException>(second != null); | |
| if (first.Modules.Count > 1 || second.Modules.Count > 1) | |
| throw new NotImplementedException("Assemblies with more than one module are not supported yet."); | |
| Match(first.MainModule, second.MainModule); | |
| } |
| { | |
| "metadata": { | |
| "name": "Untitled1" | |
| }, | |
| "nbformat": 3, | |
| "nbformat_minor": 0, | |
| "worksheets": [ | |
| { | |
| "cells": [ | |
| { |
| from collections import namedtuple | |
| PutStrLn = namedtuple('PutStrLn', 'value') | |
| Read = namedtuple('Read', []) | |
| def hello(): | |
| _ = yield PutStrLn('Hello.') | |
| return True | |
| def f(myname): |
| sealed trait Nat { type N <: Nat } | |
| sealed trait S[P <: Nat] extends Nat { type N = S[P] } | |
| sealed trait Z extends Nat { type N = Z } | |
| sealed trait Pred[A <: Nat] { type Out <: Nat } | |
| object Pred { | |
| def apply[A <: Nat](implicit pred: Pred[A]): Aux[A, pred.Out] = pred | |
| type Aux[A <: Nat, B <: Nat] = Pred[A] { type Out = B } | |
| implicit def pred[B <: Nat]: Aux[S[B], B] = new Pred[S[B]] { type Out = B } | |
| } |
| #!/usr/bin/env python | |
| from struct import pack, unpack | |
| import re | |
| import os, errno | |
| import os.path | |
| def mkdir_p(path): | |
| try: | |
| os.makedirs(path) |
| import cats.{MonadError, Monad} | |
| import cats.data.Xor | |
| import scala.annotation.tailrec | |
| object io { | |
| object unsafe { | |
| type Val = Any with ({ type Tag = Any }) | |
| object Val { |
def point: () => F[Unit]
def pure[A]: A => _ => F[A]
def raiseError[A]: E => _ => F[A]
def zero[A]: () => _ => F[A]
def map[A, B]: (A => B) => F[A] => F[B]
def flatMap[A, B]: (A => F[B]) => F[A] => F[B]
def ap[A, B]: (F[A => B]) => F[A] => F[B]
def handleErrorWith: (E => F[A]) => F[A] => F[A]
def product[A, B]: F[B] => F[A] => F[(A, B)]