やあ。Hack言語の世界へようこそ。
私はHHVMの心臓部で型チェッカーの挙動を日々見守っているアーキテクトだ。
君たちがPHPの「なんとなく動く」という甘い蜜から卒業し、Hackという厳格で高潔な地平に足を踏み入れたことを歓迎する。今回は、多くのエンジニアが沼に足を取られる「数値計算」と「浮動小数点」の罠、そしてそれをHackの型システムとHSL(Hack Standard Library)でどう攻略するかを語ろう。
—
1. PHPの「曖昧さ」という悪魔
PHPは魔法のような言語だ。`”10″ + 5` と書けば、自動的に型を変換して `15` と返してくれる。初心者の頃は便利だが、大規模なシステムにおいて、この「おせっかいな自動変換」はバグの温床となる。
特に浮動小数点は厄介だ。`0.1 + 0.2` が `0.3` にならないのは有名だろう。PHPでこれを放置すると、決済や統計処理で致命的な誤差を生む。
Hackの哲学はこうだ: 「曖昧な状態を放置せず、型で縛り上げ、計算の責任をコンパイル時に確定させる」
—
2. HSLで数学を「安全」にする
PHPのグローバル関数(`sqrt()` や `floor()` など)をそのまま使うのは、もうやめよう。Hackでは `HH\Lib\Math` モジュールを使うのが正解だ。
基本的な使い方
まずは、安全な数値計算の第一歩を見てほしい。
use namespace HH\Lib\Math;
<<__EntryPoint>>
function main(): void {
// 数値の最大・最小を確実に扱う
$a = 10.5;
$b = 20.2;
// HSLの Math\max は型安全。 float 同士を比較し、 float を返す
$max_val = Math\max($a, $b);
// もしここで誤って文字列を渡せば、コンパイル時に型チェッカーが怒鳴りつけてくる
// Math\max(“10”, 20); // Error: Argument 1 must be num, string given
\print(“最大値は: ” . (string)$max_val . “\n”);
}
—
3. なぜ「浮動小数点」を制御する必要があるのか?
コンピュータはメモリ上で数字を「2進数」で表現している。そのため、0.1のような「10進数で割り切れる数」が、2進数では無限小数になってしまう。
陥りやすいエラー:厳密な比較
$a = 0.1 + 0.2;
// 悪い例: if ($a == 0.3) { … }
// これが真になることは、コンピュータの構造上、保証されない。
これをHackでどう扱うか? 賢明な開発者は「イプシロン(極小値)」を使って比較する。HSLは直接的な演算子よりも、数学的な設計を要求する。
use namespace HH\Lib\Math;
function is_nearly_equal(float $a, float $b): bool {
// 差の絶対値が十分に小さければ等しいとみなす
return Math\abs($a – $b) < 0.00001;
}
この「あえて面倒なことをさせる」のがHackの真骨頂だ。君が計算の誤差を制御しているという「自覚」を、コードに刻み込むんだ。
---
4. 型システムで守る「数値」の境界線
Hackには `num` という便利な型がある。これは `int` と `float` の両方を受け入れられる型だ。しかし、計算結果を厳密に制御したいなら、関数のシグネチャを絞り込むべきだ。
- int: 整数。カウントやIDなどに使う。
- float: 浮動小数点。物理演算や統計など、精度が許容される範囲で使う。
もし、金額のような「1円の誤差も許されない」計算が必要なら、`float` を使ってはいけない。その場合は、「最小単位の整数(例:円なら銭単位のint)」として計算するか、BCMathのようなライブラリをラップして「独自の型」として扱うのが正解だ。
—
5. 先輩からのアドバイス:ここをクリアすれば大丈夫!
初心者が最も躓くのは「型エラーを消すためのキャスト(型変換)」で無理やり数値を変換してしまうことだ。
- `$val as float` と書くのは、「私はこの変数がfloatであることを保証する」という宣言だ。
- もし `as` を使わずに `(float)$val` と書くなら、それは「型を強制変換してでも動かしたい」という逃げ道だ。
極意:
「`as` を使うときは、なぜその数値がその型であると断言できるのか、論理的な根拠をコメントに残すこと。」
これだけで、君のコードの信頼性は数段跳ね上がる。
—
まとめ
1. グローバルな数学関数を捨て、`HH\Lib\Math` を使え。
2. `0.1 + 0.2` にはイプシロン(許容誤差)で立ち向かえ。
3. 型エラーは「敵」ではなく、バグを防ぐ「守護神」だと認識せよ。
Hackの型システムは、君の書くコードを未来の自分やチームへの「契約書」に変えてくれる。浮動小数点の不確かささえも型で管理するようになれば、君はもう立派なHackエンジニアだ。
さあ、エディタを開いて、厳格で美しい計算ロジックを実装してみよう。君ならできるはずだ。