Haskell の代数データ型で使われるデータ構築子は、実は関数と同様に扱えます。たとえば、四則演算の式を表す代数データ型を以下のように定義したとします。 data Expr = C Int | Add Expr Expr | Sub Expr Expr | Mul Expr Expr | Div Expr Expr deriving Show "1 + 2" は "Add (C 1) (C 2)" と表現できます。この式を評価してみましょう。 Add (C 1) (C 2) → Add (C 1) (C 2) 当たり前ですが、そのものが返ってきます。 話は変わりますが、add という関数を素直に定義すると、こうなるでしょう。 add x y = x + y 式 "add 1 2" を評価するとこうなります。 add 1 2 → 3 すなわち、関数であれば簡略化されますが、データ構築子であ