Как вы соединяетесь с 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 не является чисто функциональным, вы не можете. Лучшее, что можно сделать, - это изолировать мутационные эффекты, чтобы легко распознать их в вашем коде.