Числовой тип подписи - PullRequest
       34

Числовой тип подписи

9 голосов
/ 04 июня 2011

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

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

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

1 Ответ

10 голосов
/ 04 июня 2011

Функция, которую вы ищете, это натуралы уровня типа , известные как расширение -XTypeNats для Haskell.

На данный момент это возможно только в эксперименте филиал ГХК.Я думаю, что он может слиться с GHC на 7,4.

Некоторое дальнейшее чтение:

...