Встроенные записи в полиморфных c вариантах? - PullRequest
1 голос
/ 29 апреля 2020

В главе 8 «Расширения языка» руководства описаны «встроенные записи» (8.17) :

Аргументы конструкторов типа суммы могут теперь определяется с использованием того же синтаксиса, что и записи. Допустимы изменяемые и полиморфные c поля. Синтаксис GADT поддерживается. Атрибуты могут быть указаны в отдельных полях. [...]

Я ищу это с полиморфами c вариантов:

# type a = B of {x:int; mutable y:int} ;;
type a = B of { x : int; mutable y : int; }
# type b = `A of {u:int; mutable v:int} ;;
Line 1, characters 9-10:
Error: Syntax error

Но это не работает, поэтому сейчас я использую явную вспомогательную запись вместо этого наберите ... Как я теперь понимаю, это занимает больше памяти и несколько медленнее.

Могу ли я получить эту классную функцию и с полиморфными c вариантами?

1 Ответ

3 голосов
/ 29 апреля 2020

В случае обычных конструкторов компилятор может использовать определение типа для различения guish между:

type t = A of int * int | B
let f = function
  | A (_,y) -> y
  | B -> 0

и

type 'a t = A of 'a | B
let f = function
  | A (_,y) -> y
  | B -> 0

Таким образом, это можно оптимизировать первый

A (_,y) -> y

в «доступ ко второму полю блока» при одновременной компиляции второго случая

A (_,y) -> y

для «доступа к кортежу в первом поле блок, а затем получить доступ ко второму полю блока ".

Для вариантов polymorphi c невозможно полагаться на несуществующее определение типа, чтобы различать guish между этими двумя Следовательно, их представление в памяти должно быть равномерным. Это означает, что полиморфные c варианты всегда принимают один аргумент, и не очень полезно маркировать каждый аргумент конструктора, когда есть только один аргумент.

Вот почему встроенные записи нельзя комбинировать с вариантами polymorphi c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...