Мне интересно, можно ли определить непустой список в системе типов с помощью машинописного текста. Я знаю, что могу определить список из 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 элемент из типа.