【入門編】HSLのVecとPHPのarray_map:関数型プログラミング的アプローチによるコードの簡潔化 – Hack言語 コア・静的型システムとHHVMのアーキテクチャ解析バイブル

PHPのレガシーを捨て、Hackの「型」で未来を創る:Vecと関数型アプローチの極意

こんにちは。Hackの深淵を覗き込み、HHVMの心臓部を日々チューニングしているアーキテクトです。

PHPの「配列(`array`)」という、型も構造も曖昧なブラックボックスを触る時代は終わりました。Hackには、静的型付けによる絶対的な安全性と、それを支えるHSL(Hack Standard Library)があります。

今回は、PHP時代からの悪しき習慣である「`array_map`による力技」を卒業し、Hackの`Vec`でコードを洗練させる手法を伝授します。ここをクリアすれば、あなたの書くコードは「動く」だけのものから「壊れない」ものへと進化します。

—

1. なぜ「PHPの配列」はHackで罪なのか?

PHPの`array`は、連想配列、リスト、スタック、キューをすべて同じ構造で扱う「万能ナイフ」です。しかし、万能ナイフは往々にして指を切りやすい。

一方、Hackの`Vec`は、「順序付きのリスト」として純化されたデータ構造です。型チェッカー(HHVM Typechecker)は、`Vec`の中身が何であるかを厳格に追跡します。

PHPのレガシーなアプローチ(Bad)

// PHP的な古い書き方。型が曖昧で、バグの温床になります。
function get_prices(array $items): array {
return array_map(fn($item) => $item[‘price’], $items);
}

このコードの何が悪いのか? `array`は「何が入っているか」を型チェッカーに伝えないため、`$item[‘price’]`が存在しなかったり、数値でなかったりしても実行時までエラーに気づけません。

—

2. HSL `Vec` でコードを「関数型」の芸術へ

HSLの`Vec`モジュールを使うと、データ処理のパイプラインが非常に読みやすくなります。

HSLでのリファクタリング(Good)

use namespace HH\Lib\Vec;

type Item = shape(‘name’ => string, ‘price’ => int);

function get_prices(vec $items): vec {
// Vec\mapは、PHPのarray_mapの「型安全で洗練された」上位互換です
return Vec\map($items, $item ==> $item[‘price’]);
}

なぜこれが素晴らしいのか?

1. 型推論の透明性: `vec`を受け取り、`vec`を返す。この契約が保証されているため、後続の処理で「値が文字列だったらどうしよう」と悩む必要はゼロです。
2. 可読性: `Vec\map`は、データ変換という「操作」に焦点が当たっており、PHPの`array_map`のように「配列を操作する関数」という構造上のノイズがありません。

—

3. 陥りやすい罠:ここだけは気をつけろ!

初心者がよくやる「Hack的ではないミス」をいくつか挙げておきます。

罠①:不変性(Immutability)の忘却

Hackの`Vec`は不変です。PHPの`array_push`のように破壊的に値を書き換えることはできません。

  • 間違い: `Vec\push($my_vec, $new_val)` (`Vec`は新しいVecを返すことを忘れないで!)
  • 正解: `$new_vec = Vec\concat($my_vec, vec[$new_val]);`

罠②:`null`への甘え

PHPでは`array_map`の結果が`null`になることを許容しがちですが、Hackでは厳格です。`Vec`を操作する際は、空の結果であっても`vec[]`(空のベクタ)が返されることを型システムは期待します。`null`を混ぜてはいけません。

—

4. アーキテクトからのアドバイス:思考の転換

PHPからHackへ移行する際、最も大切なのは「データ構造を先に定義する」という意識です。

`array`を操作するのではなく、`vec`という「リスト」を変換(Mapping)し、必要に応じて`filter`し、最後に`reduce`する。この一連の関数型パイプラインこそが、Hackにおいて最も効率的で、メモリ効率も良い手法です。

HHVMのJITコンパイラは、この「不変な`Vec`に対する関数型操作」を極めて効率的に最適化します。あなたが綺麗に書けば書くほど、マシンの実行速度も上がるのです。

今日の宿題

あなたのプロジェクトにある、複雑な`array_map`を探してください。それを`use namespace HH\Lib\Vec;`を使って書き換えてみましょう。型エラーが出たら? それはHHVMが「あなたのコードの欠陥」を教えてくれている、ありがたい警告です。

Hackの世界へようこそ。型安全なコードは、あなたに自由な開発体験をもたらしますよ。

—
Hackコアコミッターより愛を込めて

タイトルとURLをコピーしました