Можно ли создать тип с числовым аргументом?
то есть, если я хочу создать тип целых чисел с фиксированной разрядностью:
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 Nil))))
, но это невероятно уродливо. Мне также нужно выяснить, как добавить два Succ
для типа результата умножения.