Сигнатура числового типа

Возможно ли создать тип с числовым аргументом?

т.е. если я хочу создать тип целых чисел с фиксированной битовой шириной:

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 для типа результата умножения.

9
задан Don Stewart 4 June 2011 в 19:57
поделиться