Типизируем задницу
На недавно прошедшем семинаре по Nemerle Владислав Чистяков, его текущий maintainer, впал в ступор, пытаясь определить тип выражения
throw NotImplementedException();
, и был несказанно удивлен, когда удалось написать что-то вроде
def a : int = throw NotImplementedException();
def b : void = throw NotImplementedException();
Честно говоря, его удивление само по себе немного удивительно, учитывая, что он ковырял много разных языков программирования, и Хаскель в том числе.
Таки вот — это выражение сигнализирует, грубо говоря, о том, что во время выполнения некой функции случилась некая задница. Кстати, именно так её и называют некоторые вполне серьезные люди — bottom (для краткости иногда обозначая её значком _|_). Исключение — это не единственное проявление задницы, бывает ещё бесконечная рекурсия.
Так какой же она может иметь тип? Ну, очевидно, задница может случиться во время выполнения абсолютно любой функции. А абсолютно любая функция может иметь абсолютно любой тип. То есть — задница может иметь абсолютно любой тип, она полиморфна! А тип того, что может иметь абсолютно любой тип, записывается в C# примерно так:
public static T Bottom<T>() { throw new NotImplementedException(); }
Причина неимоверной популярности задницы именно среди хаскеллистов объясняется ленивостью этого популярного языка. Ленивость — это передача туда-сюда «недовычисленных» выражений. Она, с одной стороны, дает преимущества в модульности кода (эти преимущества в какой-то степени должны быть знакомы и сишарпистам — весь Linq крутится вокруг «слегка ленивых» списков), но, с другой стороны, каждое из недовычисленных выражений может содержать в себе Её. Задницу.
[ Хронологический вид ]Комментарии
Войдите, чтобы комментировать.