ピューターの操り人形- Part 2


TLドクターHere's the GitHub repo.
このシリーズの前の記事では、私はPureScriptAff -sは、AWS ServerlessでPantpeteerを走らせるような複雑な非同期ワークロードを編成します.
本稿では、そのコードがJS層にどのようにリンクするかを調べたい.PureScriptには、開発者がpureScript層で厳密にタイプされた関数として解釈されるバニラJSで関数を書くのを許す簡単なffiがあります.JS関数を入力する際にエラーを防ぐものはありませんが、Effect モナド.見てみましょう.

ブラウザの起動
Chromeバイナリを取得し、ブラウザを起動する関数のpurescriptコードを見てみましょう.コードは Main.purs .
type EPromise a
  = Effect (Promise a)

foreign import executablePath_ :: EPromise String

executablePath = asAff executablePath_ :: Aff String

type LaunchBrowser_
  = String -> EPromise Browser

foreign import launchBrowser_ :: LaunchBrowser_

launchBrowser = asAff launchBrowser_ :: Affize LaunchBrowser_
これらの関数にはいくつかのことがあり、そのうちのいくつかは次の記事の主題になります.この記事では、我々は海外の宣言に焦点を当て、JS層でどのように実装されているかを示します.

JSを見せてください!
これを可能にするために使用される関数は Main.js .
var chromium = require("chrome-aws-lambda");

exports.executablePath_ = function() {
  return chromium.executablePath;
};

exports.launchBrowser_ = function(executablePath) {
  return function() {
    return chromium.puppeteer.launch({
      args: chromium.args,
      defaultViewport: chromium.defaultViewport,
      executablePath: executablePath,
      headless: chromium.headless,
      ignoreHTTPSErrors: true,
    });
  };
};
具体的には、二つを比較しましょうexecutablePath_ -s .注意すべき点は、executablePathRangeが型の値であっても、purescriptは関数を返すことですEffect (Promise String) (EPromise 上で定義されているヘルパー型).プルーフでEffect a として実装する必要がありますfunction () { return a } JavaScriptで.これはEffect Monadは常に副作用やエラーが発生する可能性があります(JavaScriptは安全で、副作用がいっぱいで、ハードドライブに書き込むような)ので、すぐに実行を避けるために関数をラップします.これにより、安全で純粋な方法で安全でない(不正な)コードを推論することができますIO Haskellのモナド
それで、我々が本当にこれを混乱させる2つの方法だけがあります:
  • JSから間違ったタイプを返すこと.
  • JSにおいて意図的にエラーを誘発する
  • PureScriptプログラムでは、これらはバグの最も一般的な源です、しかし、インターフェースが本当にきれいであるので、彼らは簡単にスポッタブルです:それは、いつも呼ばれるファイルに移されるいくつかのモジュールにありますforeign.js . しかし、これらのJS相互作用機能の表面積は非常に小さい(通常、上の関数のように、いくつかの線の順序で)、バグがある可能性は、JSまたはTSで書かれたプログラム全体よりもはるかに小さい.

    約束する約束.
    上記の関数の場合、Promise -S . Purescriptは約束が何であるか全くわからないAff -それで、それは不透明なブログのような約束を扱います、そして、幸せにそれを次の消費者に渡しますAff .
    では、タイプシステムが一貫した非同期コンテキストの使用を強制する方法について話します.Aff , ですから、約束、コールバック、async/wait、バニラコードを調整する必要はありません.