Lensを活用すれば、オブジェクト指向すら表現できる…これが、Haskellの力なのか… クラスはデータ型、メソッドはインスタンスの状態を変更するStateモナド、インスタンスはIORefに対応している。 {-# LANGUAGE TemplateHaskell, Rank2Types, ExistentialQuantification #-} import Control.Lens import Control.Applicative import Control.Monad.State import Control.Monad.IO.Class import Data.IORef infix 9 .- infix 9 .! data Vec2 = Vec2 Float Float deriving Show (&+) :: Vec2 -> Vec2 -> Vec2 Vec2 x0 y