(2024)レコードを構築するときは、Applicative 演算子よりも `do` 記法の使用を優先してください。

2026/04/01 4:57

(2024)レコードを構築するときは、Applicative 演算子よりも `do` 記法の使用を優先してください。

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

要約

Japanese Translation:

改善された要約

主なポイントは、モナド型コンストラクタでもアプリカティブ型コンストラクタでもレコードを構築する際に、従来の

<$>
<*>
演算子よりも
do
記法(
ApplicativeDo
)を使用した方が好ましいということです。
この手法は、より明確で複数行のコードを生成し、フィールドを書き込む順序に依存せず(順序非感度)、欠落しているフィールドについて有益なコンパイラ診断情報を提供します。演算子構文では見つけにくい点です。このアドバイスは特にモナドでないアプリカティブ(例:
optparse-applicative
Parser
)に適用され、
ApplicativeDo
、レコードワイルドカード、および厳格なフィールドチェック(
-Werror=missing-fields
)などの GHC 拡張に依存します。
このパターンは他のレコードベースのコンストラクタにも拡張可能ですが、位置付きまたは任意関数コンストラクタには適用できません。このスタイルを使用すると、保守性が高く、エラーメッセージが明確で、安全なライブラリを開発者とユーザーの両方に提供できます。

本文

以下は、レコードを組み立てる際に Applicative 演算子(

<$>
/
<*>
)よりも
do
記法を使うべき理由を簡潔に説明した投稿です。
このアドバイスは、
Monad
を実装している型コンストラクタ(例:
IO
)だけでなく、
Applicative
は実装しているが
Monad
ではない型コンストラクタ(例:optparse‑applicative パッケージの
Parser
型コンストラクタ)にも適用できます。後者の場合は
ApplicativeDo
言語拡張を有効にする必要があります。


ガイダンス

次のように書く代わりに:

data Person = Person
    { firstName :: String
    , lastName  :: String
    }

getPerson :: IO Person
getPerson = Person <$> getLine <*> getLine

以下のように書くべきです。

{-# LANGUAGE RecordWildCards #-}

{-# OPTIONS_GHC -Werror=missing-fields #-}

data Person = Person
    { firstName :: String
    , lastName  :: String
    }

getPerson :: IO Person
getPerson = do
    firstName <- getLine
    lastName  <- getLine
    return Person{..}

なぜ後者の方が優れているか

1. エルゴノミクス(扱いやすさ)

do
記法を使うと、レコード構築ロジックを一つの長い式に詰め込む必要がなくなるため、より扱いやすくなります。例えばユーザーに名前を入力してもらう場合:

-- Applicative 演算子(長い式)
getPerson :: IO Person
getPerson =
        Person
    <$> (putStrLn "Enter your first name:" *> getLine)
    <*> (putStrLn "Enter your last name:"  *> getLine)

-- do 記法(見やすい)
getPerson :: IO Person
getPerson = do
    putStrLn "Enter your first name:"
    firstName <- getLine

    putStrLn "Enter your last name:"
    lastName <- getLine

    return Person{..}

do
版は明確で、初心者にも扱いやすいです。

2. 順序に対する無感覚性

データ型のフィールド順を変えても:

data Person = Person
    { lastName  :: String
    , firstName :: String
    }

Applicative バージョンは「名前を逆順で読み込む」ために壊れますが、

do
バージョンは影響を受けません。一般に
do
記法を使えばフィールド順の変更による挙動変化は起こりません。

3. より良いエラーメッセージ

新しいフィールドを追加した場合:

data Person = Person
    { alive      :: Bool
    , firstName  :: String
    , lastName   :: String
    }

Applicative バージョンは型不一致に関する暗いエラーを出しますが、

do
バージョンは次のような明確なメッセージを返します。

Example.hs:…
  • Fields of ‘Person’ not initialised:
      alive :: Bool
  • In the first argument of ‘return’, namely ‘Person {..}’
    …

エラーが直接

alive
フィールドの初期化不足であることを示します。


注意点

  • このアドバイスはレコード構文で定義されたデータ型にのみ適用されます。位置引数や任意関数には当てはまりません。
  • Applicative だけを実装している型コンストラクタ(
    Monad
    を持たない)では
    ApplicativeDo
    拡張を有効にしてください。

以下は optparse‑applicative パッケージでコマンドライン引数パーサーを定義する例です。ここでも同じ

do
スタイルのレコード構築がスムーズに機能します。

{-# LANGUAGE ApplicativeDo #-}
{-# LANGUAGE RecordWildCards #-}

{-# OPTIONS_GHC -Werror=missing-fields #-}

import Options.Applicative (Parser, ParserInfo)
import qualified Options.Applicative as Options

data Person = Person
    { firstName :: String
    , lastName  :: String
    } deriving Show

parsePerson :: Parser Person
parsePerson = do
    firstName <- Options.strOption
        (Options.long "first-name"
       <> Options.help "Your first name"
       <> Options.metavar "NAME")

    lastName <- Options.strOption
        (Options.long "last-name"
       <> Options.help "Your last name"
       <> Options.metavar "NAME")

    return Person{..}

parserInfo :: ParserInfo Person
parserInfo =
    Options.info parsePerson
        (Options.progDesc "Parse and display a person's first and last name")

main :: IO ()
main = do
    person <- Options.execParser parserInfo
    print person

この例は、Applicative でも同じ

do
記法でレコードを組み立てられることを示しています。

同じ日のほかのニュース

一覧に戻る →

2026/04/03 1:10

Google が Gemma 4 のオープンモデルをリリースしました。

## Japanese Translation: > **概要:** Gemma 4は、Google の Gemini 3 研究に基づく軽量かつオープンソースの AI モデルであり、モバイル電話、IoT デバイス、およびパーソナルコンピュータ向けにパラメータあたり高い知能を提供するよう設計されています。テキスト・画像・音声といった多モーダルな推論をサポートし、140 言語で動作します。アーキテクチャはエージェント型ワークフローを取り入れており、モデルがタスクの計画、アプリの操作、関数呼び出し、およびユーザー好みのフレームワークによる振る舞いの微調整を行えるようにしています。Gemma 4 はユーザー自身のハードウェア上で実行できるため、効率的な開発と展開が可能です。ベンチマーク結果は優れた性能を示しており、IT Thinking(31B)、MMMLU(1365 タスク中約 85%)、MMMU Pro(76.9–44.2%)、AIME 2026 数学ノーツール(89.2–20.8%)、LiveCodeBench v6 コーディング(80.0–29.1%)、GPQA Diamond 科学知識(84.3–42.4%)および τ2‑bench エージェント型ツール使用小売(86.4–6.6%)において高いスコアを記録しています。これらのスコアは、Gemma 3 など以前のモデルを上回りつつ、デバイス内での展開に十分な効率性を保っていることを示し、消費者向けデバイスおよび企業用途に対して競争力があり低リソースで利用できる AI プラットフォームとして位置づけられます。

2026/04/03 3:22

**テイルスケールの新しい macOS ホーム**

## Japanese Translation: > **概要:** > Tailscale のメニューバーアイコンは、2021 年以降の MacBook Pro でノッチに隠れてしまい、ユーザーがアプリにアクセスできなくなることがあります。Apple はノッチ内のアイコンを移動または回避するネイティブな方法を提供しておらず、そのため ICE や Bartender といったサードパーティ製ツールがよく利用されます。Tailscale は `occlusionState` を使用してアイコンが隠れたときに検知し、ポップアップで警告を表示します。ただし、この警告は蓋の開閉時やモニター変更時、その他ディスプレイの不具合時に誤って発火することがあります。 > 同社は新しいウィンドウ型 macOS インターフェイス(バージョン 1.96.2 でデフォルト有効)をリリースしました。このインターフェイスはメニューバーアプリと並行して動作し、ノッチの問題に影響されません。UI には Tailnet デバイスの検索可能な一覧、Ping/IP コピー、Taildrop ファイル転送、Exit‑Node 選択、エラー時に赤く表示される Dock アイコン、ミニプレイヤー、およびオンボーディングツアーが含まれており、Dock か Spotlight から起動できてメニューバーアプリを補完する形になります。ウィンドウ型クライアントで「Hide Dock icon」を有効にしたユーザーでも、隠れたアイコンの警告が発生する可能性があります。 > Tailscale は Windows 向けにも同様の UI を計画しており、macOS 体験を向上させるためにユーザーフィードバックを収集しています。Apple の将来的な解決策は、ノッチ内でアイコン描画を防止するか、メニューバー項目用のオーバーフロー機構を提供することになる可能性があり、ウィンドウ型アプリの普及に伴いポップアップ修正が不要になる可能性があります。

2026/04/03 1:00

**Azureの信頼を蝕んだ決定 – 元Azureコアエンジニアによる考察** - **機能過剰な約束** *約束された機能が遅れて提供されるか、まったく実装されないことで、ユーザーは誤解を受けたと感じました。* - **APIの安定性が一貫していない** *頻繁に破壊的変更が行われ、十分な非推奨期間が設けられないため、開発者の信頼感が揺らぎました。* - **価格設定の不透明さ** *事前告知のない調整や混乱を招く請求モデルにより、顧客は財務予測性を失いました。* - **セキュリティパッチの遅延** *重大な脆弱性が修正されるまで時間がかかり、クライアントは不必要なリスクにさらされました。* - **ドキュメント更新の遅れ** *プラットフォームのリリースに追いつかない文書は、ユーザーを信頼性の低いコミュニティ資料へと強制しました。* これら一連の決定が、Azureがかつて利用者から享受していた信頼を徐々に蝕んでしまいました。

## Japanese Translation: --- ### Summary 著者は、Microsoft が Overlake で使用されている小型 ARM SoC に **173 の Azure ノードエージェント** を移植する計画が非現実的であり、リスクが高く、Azure Core の評判や主要顧客・政府パートナーとの信頼を損なう可能性があると主張しています。核心となる問題は、ARM SoC の厳しいハードウェア制限―2 本ポートの FPGA メモリが 4 KB に限定されていること―にあり、このため多くのエージェントをサポートすることが不可能です。現在の Xeon ノードはすでに VM 密度(ノードあたり数十台の VM とハイパーバイザー容量約 1,024 台)で苦戦しており、ワークロードに対して性能ジッターを引き起こしています。 著者はまた、OpenAI、Anthropic Claude、SharePoint Online などの高プロファイルクライアントに影響を与える可能性のあるセキュリティリスクを指摘し、国家安全保障上の懸念を提起しています。これらの懸念を Microsoft の経営層(CEO、取締役会、Cloud + AI EVP)に伝えたにもかかわらず、著者は回答や是正措置を受けていません。 2023 年以降 Azure Core に関わり、Overlake カード設計の経験もある著者は、この欠陥のある計画を進めることが Azure Core の「デス・マーチ」になり得ると警告し、顧客信頼を侵食し米国政府関係者との関係に緊張を生む可能性があると述べています。この記事は、さらに詳細を知るために Part 2 への継続読了を促しています。

(2024)レコードを構築するときは、Applicative 演算子よりも `do` 記法の使用を優先してください。 | そっか~ニュース