Для всех, что нужно знать новичку, подпись просто
undefined :: a
, что означает, как всегда с переменными типа (то есть любые строчные буквы), что a
является универсально определенным количеством , что также может быть сделано в явном виде:
{-# LANGUAGE ExplicitForall #-}
undefined :: forall a. a
... или, как я предпочитаю, писать
{-# LANGUAGE ExplicitForall, UnicodeSyntax #-}
undefined :: ∀ a. a
Количественное определение превышает всетипы , то есть все вещи с видом *
(читай: «тип», точнее тип поднятых типов - поднятый означает, что это может быть ленивый звук).Следовательно, вы можете использовать undefined
в любом выражении, независимо от того, какой тип требуется.
Теперь, undefined
, конечно, вещь, подобная «частичной функции», в основном функция, которая обнуляет аргументы, которые определенынет нигде.(FTR, это , а не функция, как функция по определению имеет аргумент [с].)
Вы хотели бы получить полезную ошибкусообщение, когда оно действительно вычисляется, но GHC по умолчанию не создает стек вызовов для всего (по соображениям производительности), поэтому раньше сообщение об ошибке было почти полностью бесполезным.Вот тут и приходит HasCallStack
: это ограничение, которое, по сути, сообщает контексту, в котором некоторый код может получить undefined
, что он должен отметить место, где это происходит, чтобы сообщение об ошибке действительнопокажи это.Итак,
undefined :: ∀ a. HasCallStack => a
Немного запутано, что HasCallStack
появляется после ∀ a
- это на самом деле не имеет ничего общего с a
, но с контекстом, в котором undefined
будетиспользоваться.Просто форма подписи всегда
<i>Identifier</i> :: <i>Quantifiers</i>. <i>Constraints</i> => <i>Type</i>
, а HasCallStack
- ограничение, поэтому оно появляется посередине.(Чаще всего ограничения фактически применяются к одной из переменных типа, по которой вы количественно оценили.)
Наконец, этот материал RunTimeRep
примерно равен полиморфизму легкомыслия .Я сам не очень понимаю, но это обсуждается в Почему неопределенная функция levity-polymorphic при использовании ее с распакованными типами?