3

純粋に機能的な言語で、副作用を導入せずにAPIに接続する方法を知りたいだけですか?機能的に純粋な言語でAPIにどのように接続しますか?

+4

"* APIとの接続*"という正確な意味はありますか? Web APIについて話していますか? – sepp2k

+1

機能ライブラリにもAPIがあります。あなたが話しているAPIの種類*についてより具体的になるのに役立ちます。おそらく非純粋なものなので、Donの答えが役に立つでしょう。 – Ben

答えて

5

Haskellなどの純粋に機能する言語は、"foreign function interfaces"を介して外国語の呼び出し関数をサポートしています。

外国語機能の種類と動作を純粋に機能的な言語(Haskellなど)にエンコードする方法があります。副作用は直接セマンティック問題なく埋め込むことができずに外国語で

ピュアな機能

機能:

は、考慮すべき2例があります。例は、Cでsin :: CDouble -> CDouble

不純な機能

不純な機能は副作用があります。しばしば、彼らは外国語の側の状態を変更する。このような関数は、副作用を正しく処理するために、依存関係/逐次の順序で呼び出さなければなりません。

これを純関数言語に埋め込むには、状態を表す外部関数との間でトークンを渡すことができます。あなたが外部関数を呼び出すたびに、新しいトークンが返され、古いトークンが破棄されます。そう

let state0 = initState 
(v, state1) <- foreignFunction state0 
(u, state2) <- foreignFunction state1 
return (v,u) 

副作用は、(関連して)state変数を修正純関数として捕捉されます。これらを前後に渡すことで安全性が確保されます。

ステートトークンを渡す配管を隠すには、モナドを使用できます。

このアプローチは、たとえばHaskellのステートフルな外部APIとのインタフェースでは非常に一般的です。製品例:MTGenトークンをライブラリが初期化された証拠として使用するmersenne-twister binding.

0

APIが純粋に機能的でない場合は、できません。コードで簡単に認識できるように、変異効果を分離するのが最善の方法です。

+0

downvoterに。純粋に制御できない状態の不純な関数を作ることはできません。 @ DonStewartの例のように状態を維持できれば大丈夫ですが、多くの不純なAPIには制御できない状態があります。 – Guvante

関連する問題