0

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ライブラリの必要性を表していますか、それとも内部でステートフルな場合に備えてそこにありますか?

4

2 に答える 2

0

関数が状態を変更せず、同じ引数が与えられたときに常に(過去、現在、および未来) に同じ値を返す場合はEff、 を返す必要はありません。

n.tagName読み取り専用で、私の知る限り、変更されることはありません。したがって、getTagNameは純粋であり、返さなくても問題ありませんEff

一方、getTextContent関数は を返さなければなりませんEff。状態は変化しませんが、異なる時点で異なる値を返します。

大多数の JS API (DOM を含む) は効果的です 数少ない例外getTagNameの1つです。そのため、FFI を作成するとき、PureScript の作成者は、必要のないまれな状況であっても、すべての JS 関数が を返すと想定しています。Eff

ありがたいことに、 の最新バージョンでpurescript-domは、、などにEff関数以外を使用しています。nodeNametagNamelocalName

于 2016-11-02T08:02:27.067 に答える
0

有効な関数とは、ウィキペディアからの純粋ではない関数です。

コンピューター プログラミングでは、関数に関する次の両方のステートメントが成り立つ場合、関数は純粋な関数として記述できます。

  1. この関数は、同じ引数値が与えられた場合、常に同じ結果値を評価します。関数の結果の値は、プログラムの実行が進行するにつれて、またはプログラムの異なる実行間で変化する可能性のある非表示の情報または状態に依存することはできません。また、I/O デバイスからの外部入力にも依存することはできません [...]。

  2. 結果の評価は、変更可能なオブジェクトの変更や I/O デバイスへの出力など、意味的に観察可能な副作用や出力を引き起こしません [...]。

DOM は状態を保存するため、DOM への呼び出しをラップする関数はほとんど常に効果的です。

PureScript の詳細については、 Eff モナドによるネイティブ エフェクトの処理を参照してください。

于 2015-06-22T15:20:39.673 に答える