#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))
… .