Как вы соединяетесь с API на функционально чистом языке?

Мне просто интересно узнать, как на чисто функциональном языке вы можете подключиться с помощью API, не вызывая побочных эффектов?

2 ответа

Решение

Чисто функциональные языки, такие как Haskell, поддерживают функции вызова на иностранных языках через "интерфейсы внешних функций".

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

Есть два случая для рассмотрения:

Чистые функции

Функции на иностранном языке без побочных эффектов могут быть непосредственно внедрены без семантической проблемы. Примером является sin :: CDouble -> CDouble в С.

Нечистые функции

Нечистые функции имеют побочные эффекты. Часто они изменяют состояние на стороне иностранного языка. Такие функции должны вызываться в зависимости / последовательном порядке для правильной последовательности побочных эффектов.

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

let state0 = initState
(v, state1) <- foreignFunction state0
(u, state2) <- foreignFunction state1
return (v,u)

побочный эффект фиксируется как чистая функция, которая изменяет (путем ассоциации) state переменная. Передача их туда и обратно обеспечивает безопасность.

Чтобы скрыть, как проходит передача токена состояния, вы можете использовать монаду.

Этот подход очень распространен, например, для взаимодействия с зарубежными API-интерфейсами с сохранением состояния от Haskell. Пример продукта: связывание мерсенна и твистера., который использует MTGen маркер в качестве доказательства того, что библиотека была инициализирована.

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

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