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