Как копировать

Я пытаюсь реплицировать следующий код в Eliom, но я не могу найти лучший способ репликации <button type="button">Default</button> <button type="button">Primary</button> <button type="button">Success</button> <button type="button">Info</button> <button type="button">Warning</button> <button type="button">Danger</button> <button type="button">Link</button>

string_button:

val string_button : 
 ?a:HTML5_types.button_attrib Eliom_pervasives.HTML5.M.attrib list ->
 name:[< string Eliom_parameters.setone ] Eliom_parameters.param_name ->
 value:string ->
 HTML5_types.button_content Eliom_pervasives.HTML5.M.elt list ->
 [> HTML5_types.button ] Eliom_pervasives.HTML5.M.elt

string_button doc: http://ocsigen.org/eliom/2.0/api/client/Eliom_output.Html5#VALstring_button

Изменение: я думаю, что подписи типа из документации Eliom

name:[< string Eliom_parameters.setone ] Eliom_parameters.param_name

type +'a param_name

type 'a setone = [ 'One of 'a | 'Set of 'a ]

будет означать, что я буду использовать что-то вроде

~name:('One "name_goes_here")

который имеет подпись типа

[> 'One of string ]

что заставило бы меня поверить, что мне нужно использовать

~name:('One "name_goes_here") param_name

получить подпись

[< string Eliom_parameters.setone ] Eliom_parameters.param_name

но это приводит только к следующей ошибке:

Error: Parse error: currified constructor

Что я делаю не так?

1 ответ

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

Eliom_parameters.param_name

Из документации Eliom:

type 'a param_name

Абстрактный тип имени параметров. <code>'a</code> параметр типа представляет собой тип фантом, как правило, подтип Eliom_parameters. Setoneradio, используется для обозначает арность параметра.

Здесь фантомный тип означает, что параметр типа фактически не отображается в определении типа, но служит только средством, помогающим элементам проверки типов различать значения дальше, чем только их оригинальный "неразделенный тип" (я имею в виду здесь тип без типа фантомных параметров). Другими словами, что бы 'a ни было, оно не изменит фактическое значение, которое ожидает ваша функция, но может ограничивать, какая другая функция могла бы манипулировать этим значением после его ввода.

Тем не менее, тип itelf является абстрактным типом, что означает, что мы не можем напрямую построить значение этого типа, мы должны полагаться на функции, входящие в структуру, чтобы предоставить их нам.

Если мы посмотрим, как построены службы в eliom, мы замечаем, что формы создаются с использованием заполнителей для значений такого рода и завернуты функцией, поддерживающей параметр для каждого из этих значений. Это позволяет создавать многоразовые и содержательные фрагменты html, такие как формы с сильно типизированными параметрами.

Документация подтверждает это понимание:

Eliom переопределяет большинство элементов форм (входы, текстовые поля, флажки и т.д.), Чтобы можно было проверить тип формы по типу службы.

В вашем случае элементы еще не встроены в форму, поэтому наилучшим вариантом является использование так называемых необработанных элементов. Большинство (если не все) из них расположены в тех же модулях, что и обычные виджеты формы; тот, который вы хотите использовать, называется raw_button и принимает string аргументы для параметров name и value.

licensed under cc by-sa 3.0 with attribution.