Списки Java FoldMap или «как обойти ленивый / нетерпеливый диссонанс» - PullRequest
3 голосов
/ 05 февраля 2012

Я портирую этот пакет на Java и застрял, пытаясь обойти ленивый / нетерпеливый диссонанс между двумя языками. Я не думал, что это будет так серьезно, потому что реализация полностью зависит от типов функций, но, думаю, я ошибся. Как мне сохранить достаточно лени, чтобы это работало? В качестве альтернативы, как мне минимально переписать это так, чтобы оно стало достаточно нетерпеливым для Java?

Код

Доступен прямо сейчас на pastebin, спасибо за сообщение.

InfiniteListException.java

TransformFunc.java

TransformCSFunc.java

FM.java

FMList.java

Проблема

Я получаю переполнение стека (хе) почти для каждого метода «функционального стиля», и force() должен вызываться почти постоянно, чтобы предотвратить их, даже когда не кодирует функционально. *

Ответы [ 3 ]

3 голосов
/ 05 февраля 2012

Вы возненавидите мой ответ, так как очень трудно преобразовать код из функционального языка в императивный, даже если он не кажется таким очевидным.

Есть две основные вещи, которые вы можете сделать:

  1. Перепишите, чтобы удалить рекурсию. Это не всегда возможно и не легко. Иногда для этого есть алгоритм (единственный, который я могу придумать - это когда рекурсивная функция хвоста, но может быть и больше). В других случаях вы должны выполнить работу самостоятельно и написать пользовательскую функцию, которая выполняет те же функции, что и оригинал, но делает это без использования рекурсии.

  2. Вы можете создать свою собственную систему, подобную стеку вызовов, для использования вместо стека вызовов, который использует язык. Это позволяет вам выполнять оптимизацию, которую выполняют функциональные языки, но не обязательно, это позволяет вам иметь стек для каждой функции, что снижает вероятность исчерпания стека, а также позволяет иметь стек размер вам нравится.

Конечно, вы можете комбинировать с этими двумя техниками столько, сколько захотите, поскольку в основном вам потребуется решение для каждой функции, используемой в сценарии.

Как я уже сказал, это не очень хорошие новости. Это довольно неприятные новости, поскольку это означает, что впереди еще много работы, если вы хотите перенести эту (или любую другую) функциональную библиотеку в императивный мир.

1 голос
/ 09 ноября 2012

Нетрадиционным способом было бы скомпилировать слегка измененный исходный код на Haskell с помощью Frege .

Необходимые модификации часто ограничиваются списком экспорта (у Frege его нет) и импортом.*

1 голос
/ 04 марта 2012

Я незнаком с FoldMap, но некоторые из функций List-1002 * функционала-java (также Массивы и Потоки ) реализованы внутри с использованием постоянного пространства стека, посмотрите, например, foldLeft и foreach , может быть, они могут помочь ..

...