Задача здесь заключается в следующем:Как создать библиотеку, которая может обслуживать модуль Haskell по сети?
- Клиент запрашивает функцию, которая будет выполняться при условии имя и его аргументы.
- Сервер выполняет функцию с предоставленными аргументами и возвращает результат.
Что-то вроде этого довольно легко реализовать на динамически типизированном языке, таком как Python. Но, учитывая статичную типизацию Хаскелла, это становится все труднее.
Вот мой начальный удар по проблеме:
Предположим, что функции в модуле только принимать аргументы, которые сериализации. Внедрите класс типа
Serializable
(идея взята из Cloud Haskell).Сохраните функции на карте с использованием имени функции. Не работает. Значения карты (объекты функции) не обязательно должны быть одного типа.
Единственное, что я мог придумать, чтобы разобрать модуль и создать цепочку
if else
утверждений (илиcase
заявление), ссылающихся правильную функцию, основанную на входной строки, а затем сериализации результат.Это дает жалкую производительность, так как наихудший случай «поиска» времени функции зависит от количества функций в модуле.
Каков правильный подход к решению этой проблемы? Есть ли что-то тривиальное, что мне здесь не хватает?
Если единственное, что беспокоит последний параметр, это линейный поиск по времени, вы можете написать/сгенерировать ряд функций типа 'Bytes -> Bytes', по одному для каждой функции f, формы let (arg1, ..., argN) = deSerializeArgs ввод в сериализации $ f arg1 ... argN'. Эти функции затем могут быть помещены в карту или любую другую структуру, которая вам нравится. Конечно, это все еще довольно неплохая работа и довольно уродливая. – delnan
Есть ли проблема с использованием cloud-haskell (aka distrib-process)? –
Вы можете использовать «Карта» для поиска функций - например, 'Map String Handler', где' Handler' - это что-то вроде 'Bytes -> Bytes' или' FileHandle -> IO() '. У вас просто будет написать оболочку для каждой функции RPC. – ErikR