Определение непустого списка через тип - PullRequest
2 голосов
/ 27 мая 2020

Мне интересно, можно ли определить непустой список в системе типов с помощью машинописного текста. Я знаю, что могу определить список из n элементов, подобных Tuple:

type TwoElementList = [number, number];

Но это будет работать только для списков предопределенной длины.

Я ищу в популярном курсе CIS 194 по Haskell, который дает пример определения непустого списка с использованием системы типов:

data NonEmptyList a = NEL a [a]

I think это невозможно в машинопись; но мне интересно, может ли кто-нибудь это подтвердить.


В той части CIS 914, которая определяет NonEmptyList, мы видим преобразования между этим «интерфейсом» и интерфейсом стандартного списка:

nelToList :: NonEmptyList a -> [a]
nelToList (NEL x xs) = x:xs

listToNel :: [a] -> Maybe (NonEmptyList a)
listToNel []     = Nothing
listToNel (x:xs) = Just $ NEL x xs

Итак, как указывает @JeffreyWesterkamp, ​​эквивалент в машинописном тексте действительно будет иметь интерфейс, отличный от стандартного списка, и действительно, мы могли бы создавать функции для перевода между интерфейсом [number, [number]] и [number].

Чтобы проиллюстрировать, к чему я клоню, рассмотрим следующий машинописный текст:

type NumberPair = [number, number];

const x: NumberPair = [1, 1];
const y = x[2];

Здесь Typescript покажет ошибку компиляции, потому что мы не можем получить доступ к [2] на NumberPair. Аналогично для списков нефиксированной длины тип элемента по индексу - объединение T | undefined; понятно, потому что мы не знаем, присутствует ли индекс i в списке. Но в непустом списке всегда можно гарантировать наличие индекса 0. Мне интересно, возможно ли, чтобы машинописный текст определял по сигнатуре типа, что он всегда сможет получить хотя бы 1 элемент из типа.

1 Ответ

2 голосов
/ 27 мая 2020

Да, это действительно возможно!

type NonEmptyArray<T> = [T, ...T[]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...