Skip to content

Instantly share code, notes, and snippets.

View gakuzzzz's full-sized avatar

Manabu Nakamura gakuzzzz

View GitHub Profile
@gakuzzzz
gakuzzzz / 0.md
Last active July 23, 2022 01:52
EnumReverseLookup

共通コード

public class EnumReverseLookup<E extends Enum<E>, ATTR> {

    private final Class<E> enumClass;
    private final Function<E, ATTR> getter;

    public EnumReverseLookup(final Class<E> enumClass, final Function<E, ATTR> getter) {
        this.enumClass = enumClass;
@gakuzzzz
gakuzzzz / slide.md
Last active August 10, 2021 08:50
Free-ScalikeJDBC から見る合成可能なDSLの作り方

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

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

自己紹介

@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 というライブラリがサポートしていました。

@gakuzzzz
gakuzzzz / 0_.md
Last active May 20, 2021 10:32
YAVI に Applicative な Validation 入れるよの話

making/yavi#121

  • Validator に (validateToEither と同様な) validateToAp みたいなのを作らず ApplicativeValidator を別に用意したのは何故なんでしょう?
    • validateToValidation みたいな謎な名前になってしまうから?
  • ApplicativeBuilder的な ComposingN があるので FunctionNcurried を持たせなくても良さそうですね(実装は泥臭くなりますがオブジェクト生成数を抑制できます)
    • 逆にカリー化できる関数があると ComposingN のようなものを不要にできたりもします。
    • とは言えYAVIのユースケースだと Validator からメソッドチェーンで使うのが主だと思うので、ComposingN の方が有用そうですね。
    • 完全に余談ですが、カリー化できる FunctionN を別途定義するより、curried を static メソッドにすると curried(Foo::bar) みたいな使い方が可能になるので個人的にはそちらの方がお勧めです。(Functions 的な1クラスのoverloadですませられますし)
  • Validation<E, >applyValidation<List<E>, > を返すのがびっくりしますね。Applicative の挙動を期待するなら型としては Validation<E, > になるので。
  • YAVI の利用範囲から考えると、エラーの集約方法を汎用化する必要もなさそうなので、error は最初から List に決め打ちしちゃってもいいかもしれません。以下のようなイメージです。
@gakuzzzz
gakuzzzz / 1_Implicits.scala
Last active April 18, 2021 02:29
Play2 Controller Utilities
package controllers.util
import play.api.mvc.{Result, Controller}
import play.api.data.Form
import scala.util.Either.RightProjection
object Implicits {
implicit def formToEither[A](form: Form[A]): Either[Form[A], A] = form.fold(Left.apply, Right.apply)
@gakuzzzz
gakuzzzz / 0_readme.md
Last active February 26, 2021 11:20
Java Stream API で foldLeft/foldRight

Java8以降の Stream API で畳み込みを行いたい場合は Stream#reduceCollectors.reducing を使用します。

しかし、Stream API は基本的に parallel で動作する事を考慮に入れる必要があるため、Stream#reduce および Collectors.reducing には強い制約があります。 つまり、初期値は必ず単位元である必要があり、演算は結合則を満たす必要があります。

試しにその制約を満たしていない引数を渡すと、結果が定まらない事が見て取れます。 例えば 50 という初期値から 1~100 までの数値を順番に引いていくと -5000 になるはずです。

IntStream.rangeClosed(1, 100).boxed().parallel().reduce(50, (a, b) -&gt; a - b, (a, b) -&gt; a + b); // -3250 になる
@gakuzzzz
gakuzzzz / gist:8d497609012863b3ea50
Last active January 12, 2021 12:50
Scalaz勉強会 主要な型クラスの紹介
@gakuzzzz
gakuzzzz / 0_readme.md
Last active November 29, 2020 09:20
Java Stream API で foldLeft/foldRight その2

Java Stream API で foldLeft/foldRight で宿題にした StackOverflow しない実装の一例です。

面白ポイントとしては、foldRight/foldLeft の実装差分は Function::compose/Function::andThenEndo::compose/Endo::andThen に変わっただけ、という所ですね。

(注意)ただしこれは不変な List の concat を Stream を使って実装しているため、非常に遅いです。 高速な実装については読者への宿題とします。

@gakuzzzz
gakuzzzz / foo.md
Last active November 5, 2020 21:58
型引数の部分適用
class Foo {
  type L[A] = Either[String, A]
  foo[L](bar)
}

 ↓

@gakuzzzz
gakuzzzz / _0.md
Last active September 17, 2020 09:12
LinkedHashMapの初期化