В Verse предусмотрена специальная конструкция, которую можно использовать для получения типа произвольного выражения (схожая с decltype в современном C++) — type. Пригодится везде, где можно использовать тип. Например, такой тип:
Foo() : int = 0
Bar(X : type{Foo()}) : type{Foo()} = XОна особенно полезна для описания типов функций. Эта конструкция требуется для передачи типа результата функции как другой функции с эффектами, отличающимися от эффектов по умолчанию. Например, такой тип:
comparison := enum:
LT
EQ
GT
Less(X : int, Y : int)<decides> : int =
X < Y
Equal(X : t, Y:comparable where t:subtype(comparable))<decides> : t =
X = Y
В данном примере выражение comparison преобразует перечисление сравнения в операцию сравнения, которой соответствует каждое конкретное значение перечисления. В этом примере также используется специальный идентификатор _, который можно использовать в type в местах, где должен быть идентификатор, без необходимости указывать фактическое имя, которое в остальном коде не используется.