Skip to content

Latest commit

 

History

History
71 lines (59 loc) · 3.5 KB

FFI.md

File metadata and controls

71 lines (59 loc) · 3.5 KB

外部関数インタフェース(FFI)は、JavaScriptまたはバックエンドで使っている他の言語で書かれたコードとの共存を実現します。

値のインポート

foreign importキーワードはJavaScriptで定義された値や型を宣言します:

-- src/Math.purs
module Math where
foreign import pow :: Number -> Number -> Number

値をFFIからインポートするとき、値は分離されたファイルに定義されています。そのファイル名とPureScriptのソースファイル名は、拡張子「.purs」がバックエンドの言語の拡張子に置き換わっている部分を除いて同じであるべきです。例えば、上のコードはsrc/Math.pursに書かれており、対応するFFIファイルはsrc/Math.jsです。以下のようになるかもしれません:

// src/Math.js
"use strict";
exports.pow = function(x) {
  return function(y) {
    return Math.pow(x,y);
  };
};

コンパイラは、PureScriptファイルがforeign importを通じてインポートした値がFFIファイルで公開されていることを確かめます。しかし、コンパイラはFFIファイルで定義された値の実行時表現に正しい型を与えているかどうかまでは確かめられないので、その責務はあなた自身にあります。インポートした値をIntとして宣言したなら、その値が真にIntであるようにしてください(配列や関数などではなく)。

型のインポート

新しい抽象型(コンストラクタがないもの)を宣言するためには、foreign import dataを使って種を与えます:

foreign import data DOMElement :: Type

foreign import document :: {
  createElement :: String -> DOMElement
}

この方法で型を宣言しているときは、単にTypeではなく、何らかの種を持つように型を宣言するかもしれません。例えば、副作用の種を宣言するには次のようにします:

foreign import data MyRow :: # Effect