當我使用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
是effectful,但我不是很肯定getTagName
更新:
我明白什麼是純函數是,它不應該改變程序的狀態,也許DOM是一個不好的例子。
我問這個問題是因爲在大多數封裝了現有js庫的庫中,幾乎每個函數都是有效的,即使它感覺不對。所以也許我的實際問題是 - 這個效果是否代表這個包裝的js庫中的需要,還是僅僅爲了防止它在內部是有狀態的?
謝謝您的回答,我已經更新了我的問題,使之更加具體 – starper
@starper是你需要將所有不純的函數註釋爲有效的,因爲編譯器/運行時必須以不同的方式對待它們(例如,它不能緩存函數調用的結果,因爲您可以使用純函數/ [引用透明表達式](https:// en.wikipedia.org/wiki/Referential_transparency_(computer_science))) – mb21