Functional programming 什么时候功能应该有效?
当我使用FFI包装一些API(例如DOM API)时,是否有任何经验法则可以帮助我决定函数是否有效 以下是一个例子:Functional programming 什么时候功能应该有效?,functional-programming,purescript,Functional Programming,Purescript,当我使用FFI包装一些API(例如DOM API)时,是否有任何经验法则可以帮助我决定函数是否有效 以下是一个例子: foreign import querySelectorImpl """ function querySelectorImpl (Nothing) { return function (Just) { return function (selector) { return function (src) {
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库中的需要,或者只是为了防止它在里面是有状态的?从维基百科上看,有效果的函数是没有效果的函数: 在计算机编程中,如果关于函数的这两个语句都成立,则函数可以被描述为纯函数:
有关PureScript的更多详细信息,请参阅。如果函数不改变状态,并且在给定相同参数时总是返回相同的值,则不需要返回
Eff
,否则会返回
是只读的,据我所知,它从不改变。因此,getTagName
是纯的,不返回Eff
也可以
另一方面,getTextContent
函数必须返回Eff
。它不会更改状态,但会在不同的时间返回不同的值
绝大多数JSAPI(包括DOM)都是有效的getTagName
是极少数例外之一。因此,在编写FFI时,PureScript作者只需假设所有JS函数都返回Eff
,即使在极少数情况下它们也不需要返回
谢天谢地,最新版本的使用了、等的非
Eff
函数。感谢您的回答,我已经更新了我的问题,使其更加完善specific@starper是的,您需要将所有不纯函数注释为有效函数,因为编译器/运行时必须对它们进行不同的处理(例如,它不能像纯函数那样缓存函数调用的结果/)