Какой самый простой способ передать список целых чисел из 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
,