首选方法是什么,如何计算选择器选择的元素数量?
我能想到的一种方法是调用 JQuery 的size
:
size :: JQuery -> Fay Int
size = ffi "%1['size']()"
另一种方法是从函数调用中获取列表,然后计算元素。检索元素的函数类型可能是:
elems :: JQuery -> Fay [Elem]
有谁知道,如何实现?如何描述 javascript 类型和 haskell 类型之间的映射?
在 Fay 中有两种处理 javascript 对象的方法。
使用 EmptyDataDecls:
{-# LANGUAGE EmptyDataDecls #-}
[...]
data JQuery
这就是 fay-jquery 所做的,它允许库的用户轻松定义新的 FFI 绑定,因此您的大小示例有效。但请注意,它在 jQuery 中已被弃用,因此最好length
按照 John B 的建议使用。
每当 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 wiki 页面。
编辑:稍微相关,fay-uri是一个有据可查且相当简单的示例,说明如何在可变 js 库之上构建不可变 FFI 层。