アローはアローへ、カテゴリはクエリへ

2026/01/24 5:07

アローはアローへ、カテゴリはクエリへ

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

Catlang は、単一の PostgreSQL

SELECT
文に直接コンパイルされる小さなカテゴリ論的プログラミング言語です。
そのコアプリミティブは矢印(関数)と合成、分岐(
)、共積注入(
inl
inr
)、除去(
)などのカテゴリー演算です。中間言語(IL)はスタックベースで、変数名の代わりに射影(
prj₁
prj₂
)を使用し、変数自体が存在しないため、バックエンドコンパイルが簡素化されます。

特殊なループプリミティブ

cochoice
は、Either 値上の矢印を通常の反復に変換します;コンパイラはこれを再帰的共通テーブル式(CTE)として実装します。PostgreSQL 17 に明示的なステップカウンタがないため、実装では
clock_timestamp()
を使用して行を順序付け、最終結果を選択します。

SQL 生成は各カテゴリー演算を SQL 構造にマッピングします:合成 → ネストされたクエリ、分岐 →

CROSS JOIN
、共積 → アクティブなコンストラクタを示す列が
NOT NULL
とマークされた三列テーブル、除去(
)→
UNION ALL
で非 NULL 列をフィルタリングします。

簡単な例プログラムは左値が生成されるまでループし、

100
を返します。PostgreSQL 17 で生成されたクエリを実行すると、その単一行が得られます;
LIMIT 1
節を削除すると各反復ごとに1行が表示され、ループのトレースが明らかになります。

すべてのソースコードは GitHub にあり、Template‑Haskell バックエンドは同等の Haskell 矢印コードを生成できます。著者は Brainfuck インタプリタなどのより複雑なプログラムを SQL にコンパイルする予定であり、PostgreSQL をその内部で実行するといったメタ・サーキュラーアイデアも検討しています。

この改訂された概要は、すべての主要ポイントを完全に反映し、非推奨の推論を回避し、曖昧な表現を明確化しています。

Text to translate

(incorporating missing points and removing unsupported inferences):**

本文

最近、少し休暇を取っており、特に自分らしい不合理な使い方で時間を過ごしています。
その結果として、SQL にコンパイルされる小さなプログラミング言語「catlang」を作りました。
これは新しいクエリ言語ではなく、プログラミング言語であり、コンパイラは 1 つの巨大な

SELECT
文を出力します。
そのクエリを PostgreSQL で実行すると、あなたのプログラムの結果が得られます。

なぜこんなことをしたのでしょうか?
面白いコンパイル先を使って言語自体の機能を試したかったからです。中間表現は抽象的なカテゴリー理論の雑学で構成されており、後ほど詳しく説明しますが、まずは実際に動作させてみましょう。


簡単な例

以下は入力に関係なく

100
を返す関数ですが、その処理を while ループと同等の形で書いています。

count :: Int -> Int
count =
  x ->
    loop x
      i ->
        n <- join id id -< i
        z <- abs . (-) -< (n, 100)
        case z of
          inl _ -> inr . (+) -< (n, 1)
          inr _ -> inl -< n

アロー記法に慣れていれば、ブロックは単一の

proc
ブロックと見なせます。
アイデアは、
x
から始めてそれをループし、新しい値
n
を計算し、それから 100 を引いて絶対値を取るというものです。結果が負(
inl
)なら
n
に 1 を足して
inr
で包み、ループは「この新しい値で再度実行する」と解釈します。そうでなければ (
inr
) は
n
を返します。


中間言語

count
のソース構文をデスギャラリングした後、変数名のないアローとコンビネータだけからなる IL 表現が得られます:

id △ id
⨟ cochoice
    ( undist
    ⨟   ( (prj₁ ⨟ id ▽ id) △ id
          ⨟   ( prj₁ △ 100
              ⨟ (-)
              ⨟ abs
              )
            △ id
          ⨟ prj₁ △ id
          ⨟ dist
          ⨟   ( (prj₂ ⨟ prj₂ ⨟ prj₁) △ 1
              ⨟ (+)
              ⨟ inr
              )
            ▽ ( prj₂
              ⨟ prj₂
              ⨟ prj₁
              ⨟ inl
              )
        )
      △ prj₂
    ⨟ dist

IL は読むのが意図的に難しく設計されていますが、各コンビネータには SQL にマップできる明確な意味があります。


カテゴリ理論の基礎

  • id
     – 恒等アロー(何もしない)。
  • 合成
    (⨟)
    – 2 本のアローを接続。
  • フォーク
    (△)
    – 入力を受け取り、ペアで出力。
  • 投影
    prj₁
    ,
    prj₂
    – ペアから要素を抽出。
  • コプロダクトは
    inl
    ,
    inr
    を注入に使い、分岐には
    (▽)
    を使用。

ループは cochoice で実装されます:

cochoice :: (Either a c ~> Either b c) -> (a ~> b)

これはアローを

Either
上で走らせ、
inl
が出るまで継続し、それ以外の場合は
inr
の値をフィードバックします。これにより純粋で静的型付けされたループ構造が得られます。


SQL へのコンパイル

各コンビネータは次のような SQL フラグメントへ変換されます:

コンビネータSQL 変換
id
SELECT * FROM {input}
(⨟)
ネストされたクエリ
(△)
CROSS JOIN
(列を結合)
dist
/
undist
UNION ALL
WHERE ... IS NOT NULL
を付けて実装
cochoice
再帰 CTE (
WITH RECURSIVE
) でループし、
inl
が出たら停止

積(product)は別々の列として表現され、コプロダクトは 3 列にフラット化されます:

(f1 INT NOT NULL,
 f2 INT,            -- f2 と f3 のどちらか一方のみが NOT NULL
 f3 INT)

再帰 CTE はタイムスタンプ列 (

clock_timestamp()
) を使ってイテレーションを順序付け、最終行を選択します。


生成された SQL

count
に対する上記の変換を実行すると、大量のクエリが生成され、PostgreSQL 17 で実行すると
100
を返す単一行が得られます。
最後の行を次のように変更すると:

SELECT * FROM recursion ORDER BY step DESC LIMIT 1)

から

SELECT * FROM recursion ORDER BY step DESC)

に変えると、全ての中間イテレーションが表示されることが確認できます。


今後の方向性

  • brainfuck インタプリタを catlang で書き、文字列操作プリミティブを追加して SQL にコンパイル。
  • 他のバックエンド(例:C や PostgreSQL 内の PostgreSQL)への展開を検討。

このプロジェクトは Haskell のアロー記法と「Compiling to Categories」という論文からインスピレーションを得ています。ソースコードは GitHub に公開しており、改善提案(プルリクエスト)は歓迎です。


主要用語

  • ~>
    – catlang で書けるアロー。
  • ->
    – メタ理論における通常の関数。

同じ日のほかのニュース

一覧に戻る →

2026/01/28 4:20

Chrome Canary でテキスト拡大・縮小のサポートをお試しください。

## 日本語訳: --- ## 要約 Chrome Canary は、ウェブページ上でオペレーティングシステムのテキストサイズ設定を尊重するようブラウザに指示する新しいメタタグ `<meta name="text‑scale">` の利用をユーザーが選択できるようになりました。 この機能はまだ実験的で、オプトインフラグによって制御されています。 2024 年夏に CSS Working Group に提案され、CSS Fonts 5 仕様に追加されたもので、サイトがシステムテキストスケーリングを尊重するよう設計されていることを示します。 モバイルユーザーの約三分の一(Android 約 37%、iOS 約 34%)が OS テキストサイズを調整していますが、ほとんどのブラウザはこれらの設定を無視しています。 Safari と Chrome はスキップし、Firefox for Android はページズームを使用します。 グローバルサポートを有効にするとデスクトップレイアウトが壊れる可能性があります(例:フォントサイズが倍になると LinkedIn のページが崩れます)。 したがって慎重な実装が必要です。 **開発者向けベストプラクティスチェックリスト:** 1. **初期 CSS `font-size` を上書きしないでください。** デフォルトを medium(約 16 px)に設定するか、パーセンテージ値を使用します。 2. **コンテンツ要素にはフォント相対単位(em, rem)のみを使用してください。** 必要がない限り、マージン・パディング・ギャップには使用しません。 3. **開発者ツールで 320 px ビューポートに 200 % テキストスケールをシミュレートし、`env(preferred-text-scale)` 関数を使ってテストしてください。** 未解決の質問があります:大きな見出しは本文より低い倍率で拡大すべきでしょうか(例:32 px → 64 px)? ブラウザは今年後半に `<meta name="text‑scale">` をサポートする可能性がありますが、他のエンジンについては確認されたタイムラインはありません。 追加議論とドキュメントは CSS Day 2026(6 月)で予定されています。 広く採用されれば、デザインを壊すことなくアクセシビリティ設定に対応できるようになります—ただしレイアウトの崩れを防ぐためにスペーシング単位を管理する必要があります。

2026/01/28 5:35

タイムステーション・エミュレータ

## Japanese Translation: > ## 要約 > タイムステーションエミュレーターは、スマートフォンやタブレットを低周波ラジオ送信機に変換し、ほとんどの原子時計や腕時計の同期に使用できる時間信号を放送します。NTP スタイルのアルゴリズムを用いて ±24 h のオフセットを許容し、自動的に夏時間変更と DUT1 うるう秒補正(適宜)を適用することで、BPC、DCF77、JJY、MSF、および WWVB の5つの公式局をエミュレートします。ツールは WebAssembly を介してブラウザ上で完全に動作し、インストールやデータ収集は不要です。また、44.1 kHz PCM 出力以上の DAC サポートがあれば十分です。 > > パフォーマンスは内蔵スピーカーで最も優れています。有線ヘッドホンでも動作しますが、Bluetooth やオーディオフィーバー機器では搬送波のサブハーモニック変調に必要な高周波共振子を歪めることがあります。2024 年初頭時点で iOS の Safari と Android の Firefox は不具合があり、機能しません。ユーザーは希望する局を選択し時計パラメータを設定した後、電話のスピーカーを時計のアンテナに近づけます。音声波形は、搬送波周波数のサブハーモニック変調によって実際のタイムステーション放送を模倣する RF ノイズを生成するよう設計されています。 > > エミュレーターは最大ボリュームで再生すると永久的な聴覚障害を引き起こす可能性があるため、スピーカーを直接聞くことを避けるよう警告します。ホストサイトは <https://timestation.pages.dev/> であり、そのソースコード(Unicode とアイコン資産を含む)は MIT ライセンスに準拠し、適切な帰属要件が課されています。

2026/01/28 3:57

レナート・ポッタリングとクリスチャン・ブラウナーは新しい会社を設立しました。

## Japanese Translation: まとめはすでにKey Pointsリストと完全に一致しているため、変更の必要はありません。