3

私はこのパッケージをJavaに移植していて、2つの言語間の怠惰な/熱心な不協和を回避しようとして立ち往生しています。実装は関数型に完全に依存しているので、それほど深刻になるとは思いませんでしたが、間違っていたと思います。これが機能するのに十分な怠惰を維持するにはどうすればよいですか?あるいは、Javaに十分熱心になるように、これを最小限に書き直すにはどうすればよいですか?

コード

教えてくれてありがとう、今はペーストビンで直接利用できます。

InfiniteListException.java

TransformFunc.java

TransformCSFunc.java

FM.java

FMList.java

問題

私はほとんどすべての「機能スタイル」メソッドでスタックオーバーフロー(heh)を取得し、機能的にコーディングしていないforce()場合でもそれらを防ぐためにほぼ常に呼び出す必要があります。

4

3 に答える 3

3

コードを関数型言語から命令型言語に変換するのは、たとえそれが前もって表示されていなくても、本当に苦痛なので、あなたは私の答えを嫌うでしょう。

基本的に2つのことができます。

  1. 再帰を削除するために書き直します。これは常に可能であるとは限らず、簡単でもありません。時々、そうするためのアルゴリズムがあります(私が頭のてっぺんから考えることができる唯一のものは、関数が末尾再帰であるときですが、もっとあるかもしれません)。また、自分で作業を行い、元の関数と同じように実行するが、再帰を使用せずに実行するカスタム関数を作成する必要がある場合もあります。

  2. 言語が使用しているコールスタックの代わりに使用する独自のコールスタックのようなシステムを構築できます。これにより、関数型言語で行う最適化を行うことができますが、命令型ではできません。関数ごとにスタックを作成できるため、スタックが不足する可能性が低くなり、スタックを作成することもできます。あなたが好きなサイズ。

もちろん、基本的にスクリプトで使用されるすべての関数に対するソリューションが必要になるため、2つの手法を好きなだけ組み合わせることができます。

私が言ったように、それは良いニュースではありません。この(または他の)機能ライブラリを命令型の世界に移植したい場合、これはかなり多くの作業が先にあることを意味するので、これはかなり厄介なニュースです。

于 2012-02-05T11:25:46.003 に答える
1

私はFoldMapに慣れていませんが、function-javaのList関数(ArraysStreamsも)の一部は、一定のスタックスペースを使用して内部的に実装されています。たとえば、foldLeftforeachをチェックしてください。

于 2012-03-04T19:02:50.997 に答える
1

不便な方法は、わずかに変更されたHaskellソースコードをFregeでコンパイルすることです。

必要な変更は、多くの場合、エクスポートリスト(Fregeにはありません)とインポートに限定されます。

于 2012-11-09T14:53:29.927 に答える