Haskell类型仅支持加法和减法

Dre*_*rew 3 time haskell timer

假设我有一个类似的类型.

data Seconds | Seconds Integer
Run Code Online (Sandbox Code Playgroud)

我可以定义一个像这样倒计时的函数.

decrementTimer :: Seconds -> Seconds -> Seconds
decrementTimer (Seconds internalSecondsOne) (Seconds internalSecondsTwo) = Seconds $ internalSecondsOne - internalSecondsTwo
Run Code Online (Sandbox Code Playgroud)

但这似乎很乏味和混乱,我必须为每一个时间表示这样做; 小时,分钟,持有秒,分钟和小时的时间段数据.

我真正想做的是"实现"(?)Num类型,所以我可以做这样的事情.

decrementTimer :: Seconds -> Seconds -> Seconds
decrementTimer a b = a - b
Run Code Online (Sandbox Code Playgroud)

但那我不需要支持乘法和除法吗?将Seconds除以Seconds并没有多大意义.我如何进行类型支持加法和减法?或者,如果这是不可能的,或者我的推理是完全错误的,那么在Haskell中执行此操作的惯用方法是什么?

Dir*_*ple 6

你不熟悉标准的前奏,Num类型类要求你实现对这种数据类型没有意义的函数.基本上有三种选择

  1. 将函数命名为+和 - 以外的函数.这可能是首选方案.
  2. 实现Num类型类,但具有无意义的函数会引发错误.这有一个缺点,它将应该是编译时错误变成运行时错误.
  3. 使用不同的Prelude,例如将Num中的函数拆分为其他类型类的Numeric Prelude.此选项在数学上是最正确的,但也有点不方便,因为它不使用标准Prelude.