Какой самый простой способ передать список целых чисел из Java в функцию Frege?

Предположим, у меня есть модуль Фреге

module Util where

total :: [Int] -> Int
total xs = fold (+) 0 xs

Если бы "тотал" был написан на Java, я мог бы вызвать его через

Util.total(Arrays.asList(1,2,3));

Как лучше всего назвать реализацию Frege из Java?

1 ответ

Решение

Вы можете использовать старый добрый массив int [], соответствующий тип frege будет JArray Int. Поскольку массивы можно создавать из списков и в списках как на Java, так и на frege, они хороши для таких задач.

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

Если есть проблемы ргд. пространство кучи, также есть так называемый ArrayIterator в Data.Iterators, который является экземпляром класса типа ListView. Таким образом, другой вариант будет написать ваш фреге, чтобы взять ListView

total xs = fold (+) 0 xs.toList

и в Java называют эквивалентом

ArrayIterator.from (... code to create array here ...)

И если вы не можете изменить код Фреге или не хотите, вы можете составить ленивый список с помощью

(ArrayIterator.from (... code to create array here ...)).toList

И последнее, но не менее важное: вы можете свернуть массив, не конвертируя его ранее с foldArray,

Другие вопросы по тегам