外部関数インタフェース(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