jacob
12/24/2018, 12:40 AMjacob
12/24/2018, 12:41 AMpakoito
12/24/2018, 12:42 AMlift2
?jacob
12/24/2018, 12:44 AMjacob
12/24/2018, 12:45 AMjacob
12/24/2018, 12:45 AMjacob
12/24/2018, 12:46 AMpakoito
12/24/2018, 12:58 AMjacob
12/24/2018, 1:00 AMfun <F, A, B, C> lift2(FA: Applicative<F>, f: (A) -> (B) -> C, a: Kind<F, A>, b: Kind<F, B>): Kind<F, C> {
return FA.run { a.map { f(it) }.let { b.ap(it) } }
}
fun <L, R>rightCombine(SG: Semigroup<R>, a: Either<L, R>, b: Either<L, R>): Either<L, R> {
val f = { xa: R -> { xb: R -> SG.run { xa.combine(xb) } } }
return lift2(Either.applicative(), f, a, b).fix()
}
looks correctjacob
12/24/2018, 1:00 AMpakoito
12/24/2018, 1:02 AMpakoito
12/24/2018, 1:02 AMpakoito
12/24/2018, 1:02 AMpakoito
12/24/2018, 1:03 AMjacob
12/24/2018, 1:04 AMjacob
12/24/2018, 1:04 AMpakoito
12/24/2018, 1:04 AMpakoito
12/24/2018, 1:04 AMjacob
12/24/2018, 1:05 AMjacob
12/24/2018, 1:06 AMjacob
12/24/2018, 1:06 AMpakoito
12/24/2018, 1:06 AMpakoito
12/24/2018, 1:08 AMinterface Bla<T>: Ble<T>, Blu<T>
and that’s it. In OCaml you end up with monsters like module Make_interval(Endpoint : sig
type t
include Comparable with type t := t
include Core_kernel.Sexpable with type t := t
end)
: (Interval_intf_with_sexp with type endpoint := Endpoint.t)
jacob
12/24/2018, 1:09 AMmodule where t is this other t
thing to tie them togetherpakoito
12/24/2018, 1:10 AMpakoito
12/24/2018, 1:10 AMpakoito
12/24/2018, 1:11 AMlift2
looks like map
to mepakoito
12/24/2018, 1:11 AMpakoito
12/24/2018, 1:12 AM