Functional programming 什么时候功能应该有效?

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) {

当我使用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库中的需要,或者只是为了防止它在里面是有状态的?

从维基百科上看,有效果的函数是没有效果的函数:

在计算机编程中,如果关于函数的这两个语句都成立,则函数可以被描述为纯函数:

  • 给定相同的参数值,该函数始终计算相同的结果值。函数结果值不能依赖于任何隐藏信息或状态,这些信息或状态可能随着程序执行的进行或程序不同执行之间的变化而变化,也不能依赖于来自I/O设备的任何外部输入[…]

  • 对结果的评估不会导致任何语义上可观察的副作用或输出,例如可变对象的突变或I/O设备的输出[…]

  • 由于DOM存储状态,因此包装对DOM的调用的函数几乎总是有效的


    有关PureScript的更多详细信息,请参阅。

    如果函数不改变状态,并且在给定相同参数时总是返回相同的值,则不需要返回
    Eff
    ,否则会返回

    是只读的,据我所知,它从不改变。因此,
    getTagName
    是纯的,不返回
    Eff
    也可以

    另一方面,
    getTextContent
    函数必须返回
    Eff
    。它不会更改状态,但会在不同的时间返回不同的值

    绝大多数JSAPI(包括DOM)都是有效的
    getTagName
    是极少数例外之一。因此,在编写FFI时,PureScript作者只需假设所有JS函数都返回
    Eff
    ,即使在极少数情况下它们也不需要返回


    谢天谢地,最新版本的使用了、等的非
    Eff
    函数。

    感谢您的回答,我已经更新了我的问题,使其更加完善specific@starper是的,您需要将所有不纯函数注释为有效函数,因为编译器/运行时必须对它们进行不同的处理(例如,它不能像纯函数那样缓存函数调用的结果/)