【发布时间】:2026-02-07 01:15:01
【问题描述】:
我是haskell 新手,时不时遇到问题,我会尝试在这里用几句话来描述。想象一下,我想为不同的度量声明不同的类型,这样 Haskell 类型系统就会在我的公式中发现错误:
newtype Dist = Km Float
newtype Time = H Float
newtype Velocity = KmH Float
(/) :: Dist → Time → Velocity
(Km d) / (H t) = KmH (d / v)
(*) :: Velocity → Time → Dist
(KmH v) * (H t) = Km (v * t)
所以,每当我试图在我的公式中使用错误的度量单位时,编译器都会咬牙切齿。
问题是我不能像这样实现临时多态。使用这段代码,我带来了歧义——编译器可以区分我的运算符 * 和 Prelude 中定义的那个。也无法声明 Num 类的实例,因为我需要不同类型的参数。
我想知道人们通常如何解决问题。
提前致谢!
【问题讨论】:
-
我曾经看到一个 Ada 项目试图这样做,但由于类型系统不符合它的要求,结果出现了可怕的错误。我建议您要么使用 Dimensional(它利用 Haskell 类型系统的强大功能来做到这一点),要么坚持类型同义词并依靠代码审查来发现缺陷。