Конструктор If
для вашего типа t
принимает три аргумента. Скажем, в Java мы бы написали его как конструктор вот так
If(T a, T b, T c) { ... }
Теперь мы можем думать о функции, которая принимает три аргумента, концептуально, как о функции, которая принимает кортеж, содержащий три вещи. Кортеж — это своего рода математический объект, представляющий «наиболее общий способ» иметь упорядоченную коллекцию фиксированного размера. Таким образом, кортеж из трех целых чисел — это «наиболее общий способ» (для некоторых определений «наиболее», «общий» и «способ») иметь три целых числа в одной структуре данных.
Теоретики категорий называют эту вещь «наиболее общим образом» продуктом, точно так же, как мы говорим, что произведение 3 и 5 равно 15. Вы можете прочитать о том, почему мы называем это продуктом и какими замечательными свойствами он обладает, в Википедии, если вам нравится, но основная идея такова: кортежи удовлетворяют многим «обычным» математическим свойствам умножения, таким как коммутативность, ассоциативность и дистрибутивность по сравнению с сложением. Итак, чтобы соответствовать этому математическому соглашению, OCaml использует *
(тот же символ, который мы используем для умножения чисел) для обозначения «произведения» типов. Следовательно,
t * t * t
представляет собой набор из трех значений t
, упакованных в кортеж по порядку. В Haskell мы бы просто написали это как (T, T, T)
. Если вы знакомы с Typescript, мы бы написали его как [T, T, T]
(кортежи в Typescript — это просто списки, длина и типы элементов которых нам известны заранее). Java на самом деле не имеет эквивалентного понятия для этого.
Будьте осторожны при сравнении функций и конструкторов типов в OCaml, поскольку они Смотреть похожи, но имеют разную семантику.
Вы можете думать о
*
как об «и». Таким образом, конструктор данныхIf
принимаетt
и at
и at
.