list
и option
оба являются конструкторами типов, потому что они принимают (префиксный) тип для создания типа. Таким образом, int list
является типом, но list
сам является конструктором типа. То же самое касается option
и int option
и т. Д.
В Haskell и, возможно, других типовых языках вы можете сказать, что int option
имеет вид Type
, тогда как option
имеет вид Type -> Type
. Виды относятся к типам, а типы - к значениям, как средство сказать обо всех них.
Поэтому я считаю, что когда вы говорите «список - это тип», об этом говорят свободно. На самом деле вы имеете в виду «α list
- это тип для любого типа α
». Иногда вы имеете в виду «'a list
- это тип», а 'a
- это переменная типа. Разница в том, что под α я подразумеваю некоторый конкретный тип, а под 'a
я подразумеваю некоторую переменную типа.
Когда вы создаете тип данных, datatype troolean = True | False | Derp
, тогда troolean
тип и True
, et c., являются (нулевыми) конструкторами значений.
Когда вы создаете тип данных, datatype fiat = USD of int | ChildDrawing of png
, тогда fiat
является типом, а Dollar
является конструктор значений с типом int -> fiat
.
Когда вы создаете тип данных, datatype ('a, 'b) either = Left of 'a | Right of 'b
, тогда ('a, 'b) either
является типом, either
является конструктором типа (он принимает два параметра типа и создает тип , но свободно говоря, "либо является типом"), Left
и Right
все еще являются конструкторами значений.
Я не уверен, что вас смущает в кавычках. Типы данных позволяют создавать новые типы с новыми значениями, которые не существуют (но тип, скорее всего, isomorphi c для некоторого типа, который существовал). Составление типов все еще возможно, но даже более мощно, потому что вы можете составлять типы, которые вы сделали сами, для большой точности и выразительности.
Я полагаю, вы могли бы также назвать troolean
конструктором нулевого типа, но это, вероятно, не смущайте, когда говорите, что troolean
- это Type
, а either
- это ... что?