これは、実世界の物理単位を表すデータ型です。
import qualified Prelude as P
import Prelude hiding ((+), (*), (/), (-), Int, pi)
data Int = Zero | Succ Int | Pred Int
data Unit :: Int -> Int -> Int -> * where
U :: Double -> Unit m s kg
(+) :: Unit m s kg -> Unit m s kg -> Unit m s kg
(-) :: Unit m s kg -> Unit m s kg -> Unit m s kg
(*) :: Unit m1 s1 kg1 -> Unit m2 s2 kg2 -> Unit (Plus m1 m2) (Plus s1 s2) (Plus kg1 kg2)
(/) :: Unit m1 s1 kg1 -> Unit m2 s2 kg2 -> Unit (Minus m1 m2) (Minus s1 s2) (Minus kg1 kg2)
および Show インスタンス:
instance Show (Unit m s kg) where
show (U a) = show a
このように、値のみを表示できますが、タイプ (時間、速度、または長さのタイプ) は表示できません。型パラメーター m、s、kg を取得して表示する方法を知りたいですか?
完全なコードはこちらです。