当我使用 FFI 包装一些 API(例如 DOM API)时,是否有任何经验法则可以帮助我决定函数是否应该有效?
这是一个例子:
foreign import querySelectorImpl """
function querySelectorImpl (Nothing) {
return function (Just) {
return function (selector) {
return function (src) {
return function () {
var result = src.querySelector(selector);
return result ? Just(result) : Nothing;
};
};
};
};
}
""" :: forall a e. Maybe a -> (a -> Maybe a) -> String -> Node -> Eff (dom :: DOM | e) (Maybe Node)
querySelector :: forall e. String -> Node -> Eff (dom :: DOM | e) (Maybe Node)
querySelector = querySelectorImpl Nothing Just
foreign import getTagName """
function getTagName (n) {
return function () {
return n.tagName;
};
}
""" :: forall e. Node -> Eff (dom :: DOM | e) String
感觉querySelector
很有效,但我不太确定getTagName
更新:
我明白什么是纯函数,它不应该改变程序的状态,也许 DOM 是一个不好的例子。
我问这个问题是因为在大多数包装现有 js 库的库中,几乎每个函数都是有效的,即使感觉不对。所以也许我的实际问题是 - 这种效果是否代表了这个包装好的 js lib 中的需要,或者它是否存在以防万一它内部是有状态的?