Как я могу понять пользовательский тип OCaml?

(* Data type definitions *)
type t =
  | True
  | False
  | If of t * t * t
  | Zero
  | Succ of t
  | Pred of t
  | IsZero of t

В If of t * t * t зачем использовать '*' для подключения и как это понять?

Вы можете думать о * как об «и». Таким образом, конструктор данных If принимает tи a tи a t.

Yawar 29.03.2022 18:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Конструктор 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, поскольку они Смотреть похожи, но имеют разную семантику.

Chris 29.03.2022 16:28

Другие вопросы по теме