Подпись числового типа

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

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

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


person pat    schedule 04.06.2011    source источник


Ответы (1)


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

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

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

person Don Stewart    schedule 04.06.2011