什么是首选的方法,如何计算选择器选择的元素的数量?
我能想到的一种方法是调用JQuery的size
size :: JQuery -> Fay Int
size = ffi "%1['size']()"另一种方法是从函数调用中获取列表,然后对元素进行计数。检索元素的函数的类型可能是:
elems :: JQuery -> Fay [Elem]有谁知道,如何实现它?如何描述javascript类型和haskell类型之间的映射?
发布于 2013-04-25 01:11:58
在Fay中有两种方法来处理javascript对象。
不透明的数据类型
使用EmptyDataDecls:
{-# LANGUAGE EmptyDataDecls #-}
[...]
data JQuery这就是fay-jquery所做的,它允许库的用户轻松地定义新的FFI绑定,因此您的大小示例可以工作。但请注意,它在jQuery中已被弃用,因此最好像John B建议的那样使用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 wiki page。
编辑:略有关联,fay-uri是一个文档完整且相当简单的示例,它展示了如何在可变的js库上构建一个不可变的FFI层。
https://stackoverflow.com/questions/16196595
复制相似问题