Можно ли создать тип с числовым аргументом?
, т.е. если я хочу создать тип целых чисел с фиксированной битовой шириной:
newtype FixedWidth w = FixedWidth Integer
addFixedWidth :: FixedWidth w -> FixedWidth w -> FixedWidth (w+1)
mulFixedWidth :: FixedWidth w -> FixedWidth w -> FixedWidth (2*w)
, чтобысредство проверки типов позволяет только FixedWidth
s того же типа быть добавленным или умноженным, но также определяет правильную точность результата.
Я знаю, что вы можете сделать что-то вроде этого:
data Nil = Nil
data Succ x = Succ
addFixedWidth :: FixedWidth w -> FixedWidth w -> FixedWidth (Succ w)
и представлять число 4 как Succ (Succ (Succ (Succ Nil))))
, но это невероятно безобразно.Мне также нужно выяснить, как добавить два Succ
s для типа результата умножения.