haskell-jp / beginners #18 at 2021-11-14 19:22:25 +0900

自分はC#を用いることが多いのですが、FFIを用いてHaskellの関数やユーザー定義のデータ型などをC#とやり取りするにはどのようにすればよいのでしょうか?
一応自分では調べてみたもののCの知識などを使うことが多くよくわからなかったので、できればそのあたりも教えてくださると大変助かります。
多くのプログラミング言語と*恐らく*C#も同様に、HaskellからC#の関数を呼ぶにせよ、C#からHaskellの関数を呼ぶにせよ、C言語の関数としてFFIでexportしてFFIでimportする、というのが確実かと思います。

ただ、知る限りWindows限定ではあるものの、COMを使う、という手もあるかも知れません。
と思ってhackageを漁ったら随分古いパッケージが出てきましたね... 今使えるかと言われるとこれは怪しい :disappointed:
https://hackage.haskell.org/package/com

(あと、これはWasm好きとしての余談ですがWebAssembly Interface Typesが普及すればこういう相互呼び出しも楽になるはず...)
Haskellで書かれた関数を他の言語から呼び出したい場合、GHC User's GuideのFFIのセクションにあるような手順で共有ライブラリーを作って、Cのライブラリーとして外から呼び出してやれば一応は可能です。その際、データ型の類は全てC言語で表現できる範囲に落とし込む必要があります。 https://downloads.haskell.org/ghc/latest/docs/html/users_guide/exts/ffi.html#making-a-haskell-library-that-can-be-called-from-foreign-code ただ、個人的な感触としては、C FFIを経由して外からHaskellを呼び出すのは茨の道で、Haskell側の処理を単体の実行ファイルとして使えるようにしてプロセス間通信した方が良いのではという気がします。
お二人ともありがとうございます。
やはりFFIでやるには一回Cのライブラリに落とす必要があるんですね。

プロセス間通信については一度調べてみようと思います。
最近自然言語処理でPythonを呼び出す必要がガンガンあるんですが、短時間に何度も呼び出したり相互に呼び出したりしないので、HTTPでJSONをやり取りしてます
ECSをタスクを分けられるので安全でもありますね
Python側はFastAPIで、Haskell側はservant-clientを使っています
なるほど、確かにそれが一番やりやすそうな気がしますね。そちらも調べてみようと思います。

ところでECSってなんですか?

あと、短時間に何度もやり取りする必要がある場合はやはりIPCやFFIを使うことになるんですか?
ECSと言うのはAWSのDockerコンテナ実行サービスです
ECSを分けられるというのは要するにサーバをそれぞれ分けられるということです

短時間に何度も呼び出してパフォーマンスが必要になってHTTPのボトルネックが気になる場合、やはりFFIやIPCということになりそうですね
なるほど、そうなんですね。

今のところはローカル環境でプログラムを作ることを考えててhaskellとC#を短時間に何度も通信する必要があるかもしれないのでとりあえず難しそうですがIPCを使ってみようと思います。