Fay JQuery работает с массивом элементов
Каков предпочтительный способ, как рассчитать количество элементов, выбранных селектором?
Один из способов, которым я могу придумать, - это вызвать JQuery size
:
size :: JQuery -> Fay Int
size = ffi "%1['size']()"
Другой способ - получить список из вызова функции, а затем сосчитать элементы. Тип функции, которая извлекает элементы, вероятно, будет следующим:
elems :: JQuery -> Fay [Elem]
Кто-нибудь знает, как это реализовать? Как можно описать соответствие между типами javascript и типами haskell?
1 ответ
Есть два способа обработки объектов JavaScript в Fay.
Непрозрачные типы данных
Используя EmptyDataDecls:
{-# LANGUAGE EmptyDataDecls #-}
[...]
data JQuery
Это то, что делает fay-jquery, это позволяет пользователям библиотеки легко определять новые привязки FFI, так что ваш пример размера работает. Но обратите внимание, что в jQuery это устарело, поэтому лучше использовать length
как предполагает Джон Б.
Всякий раз, когда fay сталкивается с чем-то, что должно быть типа JQuery, оно не трогает его, поэтому у вас будет прямая ссылка на объект javascript.
документация
Другой подход состоит в том, чтобы отобразить объект javascript на запись, это более хороший вариант, если рассматриваемый объект отображается легко, например, при обработке JSON или при взаимодействии клиент-сервер.
data User = User { name :: String }
userA :: User
userA = ffi "{ instance : \"User\", name : \"Adam\" }"
userB :: User
userB = User { name = "Adam" }
Это идентичные способы построения пользовательской записи, но userA, конечно, немного надуманный, возможно, значение будет получено со стороны сервера или из некоторой библиотеки JS в этом случае (в противном случае вообще нет причин использовать FFI)
В этом случае вы не будете хранить ссылку на объект JS, будет создана неизменная запись пользователя.
Я также думаю, что вы можете пропустить Fay
в типе возврата. Я думаю, можно с уверенностью предположить, что объекты jQuery не будут видоизменяться, особенно если они создаются из Fay.
length :: JQuery -> Int
length = ffi "%1['length']"
Также см. Вики-страницу FFI.
Редактировать: Слегка связанный, fay-uri - это хорошо документированный и довольно простой пример того, как построить неизменный слой FFI поверх изменяемой библиотеки js.