бесконечно рекурсивный тип в OCaml

#recursion #types #ocaml

Вопрос:

Я читаю этот файл OCaml, и он содержит следующее:

 type z = Z of z  

Это выглядит так, как будто z бесконечно рекурсивно. Чем это полезно и как я вообще могу создать такой тип?

Ответ №1:

Я не думаю, что этот тип особенно полезен, за исключением, возможно, в качестве тестового примера в теории типов.

Вы можете создавать значения такого типа, как это:

 # let rec x = Z x;; val x : z = Z lt;cyclegt; # let rec q = Z (Z q);; val q : z = Z (Z lt;cyclegt;)  

Как только у вас есть значение такого типа, вы, конечно, можете легко создать другие значения:

 # let y = Z (Z x);; val y : z = Z (Z (Z lt;cyclegt;))  

Комментарии:

1. type t = S of t | Z имеет смысл для let rec infinity = S infinity . Мы можем представить себе что-то вроде let zip l1 (count1:t) l2 (count2:t) = ... . Я проверил, что infinity это совпадает с любым из следующих случаев S x , S (S x) , S (S (S x)) … .