6

Haskell では、完全に計算するのではなく、サンクを使用するため、無限リストを使用できます。データのサンクをシリアル化するか、ファイルに保存する方法があるかどうか疑問に思っています。たとえば、 list があるとします[0..]。次に、いくつかの処理を行います (私は主にtailandに興味がありますが、 orの実行も(:)サポートする必要があります)。ここに、私が探しているものの例を示します。filtermap

serial::(SerialThunk a)=>a->serThunk
serialized = serial ([0..] :: [Int])
main=writeToFile "foo.txt" serialized

deserial::(SerialThunk a)=>serThunk->a
main=do
    deserialized <- readFromFile "foo.txt" :: IO [Int]
    print $ take 10 deserialized
4

4 に答える 4

6

いいえ。Haskell でサンクをシリアル化する方法はありません。コードがコンパイルされると、通常はアセンブリとして表現され (たとえば、これは GHC が行うことです)、サンクを作成したい関数と環境は言うまでもなく、関数のシリアル化可能な記述を回復する方法はありません。

はい。Haskell 式の記述とシリアル化など、カスタム ソリューションを構築できます。逆シリアル化と実行は、解釈によって発生する可能性があります (例:hintパッケージの使用)。

たぶん。誰か (あなた?) がコンパイラを作成したり、既存のコンパイラを変更して、プラットフォームに依存しない方法でより多くの情報を維持し、ユーザーが手動でhint. これは、Cloud Haskell (aka distributed-haskell) 開発者による調査中の画像です。

なぜですか?また、柔軟な方法でクロージャーを渡すことができるように、関数をシリアル化する機能も必要でした。ただし、ほとんどの場合、その柔軟性は実際には必要なく、代わりに、カスタム データ型および解釈関数として簡単に表現できる特定の種類の計算を渡したいと考えています。

于 2014-03-08T17:43:57.020 に答える
2

packman : 「ライブラリとしての Haskell データの評価直交シリアル化」 ( reddit リンクのおかげで) -- まさに私たちが探していたものです!

...このシリアル化は評価と直交しています: 引数は現在の評価の状態でシリアル化され、完全に評価されていない (サンク) か、部分的にしか評価されていない (サンクを含む) 可能性があります。

...ライブラリにより、分散 Haskell システムの異なるノード間でデータを送受信できます。これがコードの元になった場所です: Eden ランタイム システムです。

...この明白なアプリケーションとは別に、この機能を使用して、メモ化によってプログラムを最適化し (異なるプログラム実行間で)、選択した場所でプログラムの実行をチェックポイントすることができます。両方の使用法は、上記のリンクのスライド セットで例示されています。

...もう 1 つの制限は、シリアル化されたデータはまったく同じバイナリでしか使用できないことです。ただし、これは、関数型言語を使用した分散プログラミングへの多くのアプローチで一般的です。

...

于 2015-07-10T11:19:02.007 に答える