Хм, не то, чтобы я знал. Это было бы трудно для системы типов Хиндли-Милнера, которая лежит в основе систем типов для этих языков. (В номенклатуре Haskell) Nothing
должен иметь одновременно тип Maybe a
и [] a
.
Нечто подобное (но, к сожалению, слишком громоздкое для использования на практике IMO) может быть построено с использованием типа с фиксированной точкой над Maybe
:
-- fixed point
newtype Mu f = In (f (Mu f))
-- functor composition
newtype (f :. g) a = O (f (g a))
type List a = Mu (Maybe :. (,) a)
Это изоморфно тому, что вы просите, но это боль в заднице. Мы можем легко сделать функцию "против":
In (O (Just (1, In (O (Just (2, In (O Nothing)))))))
In
и O
являются «конструкторами идентичности» - они существуют только для проверки типов, поэтому вы можете мысленно удалить их и получить то, что хотите. Но, к сожалению, вы не можете физически удалить их.
Мы можем легко сделать функцию cons
. Нам не так повезло с сопоставлением с образцом. Я не могу говорить за другие языки семейства ML, но IIRC они не могут даже представлять более родственные типы, такие как Mu
.