# golang

2 posts in # golang

  • Join code-hex workspace on Slack. から入れる。自分の学習した内容だったり、メモ、何かしらのスニペットを雑に投稿するための Slack を運営していた。

    Slack へ投稿しておくことで、後で自分が見返したくなった時に検索機能を利用して情報を引っ張ってくるのにとても便利だった。また他人のツイートに関して、その URL を投稿しておくことでオリジナルが削除されても、スナップショットとしても残るので便利だった。

    しかし 2022 年 9 月 1 日から Slack のフリープランの内容が改定されることになった。フリープランの変更に関するよくある質問によると、ワークスペースにある 90 日が経過したメッセージやファイルのデータは全て非表示になり、有料プランへアップグレードしなければアクセスできなくなってしまう。 これでは今まで投稿したコンテンツを見返せなくなってしまうため、Discord への移行を決めた。

    ここではどう移行したかその内容を記録をする。

  • 先日面白い記事を読んだ。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 コンビネータ 関数」だったり「不動点演算子」で検索すると良い。