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

#haskell #types #type-systems #type-level-computation

#haskell #типы #тип-системы #вычисление на уровне типа

Вопрос:

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

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

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

Ответ №1:

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

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

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