Skip to content

Instantly share code, notes, and snippets.

View gakuzzzz's full-sized avatar

Manabu Nakamura gakuzzzz

View GitHub Profile
@gakuzzzz
gakuzzzz / text.md
Last active September 10, 2019 09:59
MonadError の嬉しみ (Scala Advent Calendar 2015 ADVENTAR 19th)
@gakuzzzz
gakuzzzz / 0_main.md
Last active July 2, 2021 08:17
Java8 と fugue で Validation (エムスリー Advent Calendar 2015 18th)

Java8 と fugue で Validation

この記事は エムスリー Advent Calendar 2015 の18日目の記事です。

まえがき

Java8 で色々便利になりました。でもエラー処理でやっぱり困る事は多々あって、そういう時に Either が欲しくなるものです。

Either といえば Java7 以前から Atlassian の fugue というライブラリがサポートしていました。

package jp.t2v.xanadu.ds;
import lombok.experimental.UtilityClass;
import jp.t2v.xanadu.ds.Tuples.T2;
import java.util.function.BiFunction;
import java.util.stream.Collector;
import java.util.stream.Collector.Characteristics;
import java.util.stream.Stream;
interface MyFunctor<A> {
    fun myMap<B>(f: (A) -> B): MyFunctor<B>
}
class MyFunctorList<A>(val list: List<A>) : MyFunctor<A>, List<A> by list {
    override fun myMap<B>(f: (A) -> B): MyFunctor<B>
        = MyFunctorList(list.map(f))
@gakuzzzz
gakuzzzz / readme.md
Last active January 8, 2016 04:10
Foldable&Monoid と Traverse&Applicative の関係

Monoid[G]G に入る型は型引数をとらない kind が * の型だけど、仮に * の型にダミーの型引数 [.] をつけて G[.] と表現してみると

Method Constraint Signature
Foldable#foldMap Monoid[G] F[A] => (A => G[.]) => G[....]
Traverse#traverse Applicative[G] F[A] => (A => G[B]) => G[F[B]]
Foldable#fold Monoid[G] F[G[.]] => G[....]
Traverse#sequence Applicative[G] F[G[A]] => G[F[A]]
@gakuzzzz
gakuzzzz / User.scala
Created September 11, 2015 04:56
DDD free monad
trait User {
def present[F[_]](item: Item, targetUser: User)(implicit I: Item[F]) = {
import I._
for {
onwership <- buy(item)
_ <- targetUser.take(onwership)
} yield ()
}
}
@gakuzzzz
gakuzzzz / foo.md
Last active November 5, 2020 21:58
型引数の部分適用
class Foo {
  type L[A] = Either[String, A]
  foo[L](bar)
}

 ↓

@gakuzzzz
gakuzzzz / enumerator_to_is.scala
Last active December 30, 2015 10:20
Enumerator to InputStream
val enumerator: Enumerator[Array[Byte]] = ...
val pos = new PipedOutputStream()
val pis = new PipedInputStream(pos)
Future { useInputStream(pis) }
val it = Iteratee.foreach(pos.write)
enumerator.onDoneEnumerating(pos.close()) |>>> it
@gakuzzzz
gakuzzzz / slide.md
Last active August 10, 2021 08:50
Free-ScalikeJDBC から見る合成可能なDSLの作り方

Free-ScalikeJDBC から見る合成可能なDSLの作り方

2015/07/24 関数型Scalaの集い

自己紹介

import enumlike.{EnumCompanionBase, EnumLike}
import scalikejdbc._
trait ScalikeJDBCEnumCompanion {
self: EnumCompanionBase =>
implicit def optionalTypeBinder(implicit ev: TypeBinder[EnumLikeType#ValueType]): TypeBinder[Option[A]] = ev.map(valueOf)
implicit def typeBinder(implicit ev: TypeBinder[EnumLikeType#ValueType]): TypeBinder[A] = optionalTypeBinder(ev).map(_.get)
}