# Go

1 posts in # Go

  • 先日面白い記事を読んだ。The Y combinator in Go with generics である。

    一番最初目に入ってきたのは難解なジェネリクスのコードである。

    type Func[T, U any] func(T) U
    type TagFunc[T, U any] func(Func[T, U]) Func[T, U]
    type CombinatorFunc[T, U any] func(CombinatorFunc[T, U]) Func[T, U]
    
    func Y[T, U any](f TagFunc[T, U]) Func[T, U] {
      return func(self CombinatorFunc[T, U]) Func[T, U] {
        return f(func(n T) U {
          return self(self)(n)
        })
      }(func(self CombinatorFunc[T, U]) Func[T, U] {
        return f(func(n T) U {
          return self(self)(n)
        })
      })
    }
    

    このコードを読み解くために、Y コンビネータ1というものを理解する必要がある。そのためには前提となる無名関数を利用した処理を行うコードを理解しておくとよりわかりやすくなる。なぜならこの Y コンビネータは再帰を用いた無名関数呼び出しを行うことでループ処理を実現する機構として利用できるからである。

    Footnotes

    1. Y コンビネータは不動点演算子とも呼ばれる。Google で素直に「Y コンビネータ」で検索すると Hacker News の会社情報ばかり出てくるため、「Y コンビネータ 関数」だったり「不動点演算子」で検索すると良い。