Главная » Haskell » Пакет модулей Foreign

0

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

Что интересно, в поставке стандартных модулей имеется модуль Foreign, который необходимо использовать следующим образом:

import  Foreign

Этот модуль включает в себя реимпорт всех подчинённых модулей, а также определение единственной  функции. Реимпорт подчинённых модулей очень полезен в том смысле, что в проект можно  подключить  только модуль Foreign, после чего для работы будут доступны все остальные модули.

Функция: unsafePerformIO

Описание: позволяет выполнить вычисления в монаде IO в любое время (при вызове функции), при этом возвращается результат вычисления, не обёрнутый монадой. Эта функция небезопасна. Чтобы она была безопасной,  необходимо  обеспечить детерминированность и отсутствие побочных эффектов у выполняемого действия.

Определение:

unsafePerformIO   ::  IO a ->  a

Функция определена в виде примитива.

Если при помощи этой функции выполняются действия, содержащие побочные эффекты (непосредственно ввод или вывод), то относительный порядок этих действий в монаде становится неопределённым. Однако более страшными последствиями  отличаются вызовы этой функции при использовании  полиморфизма типов в ссылках. Например:

test :: IORef  [a]

test = unsafePerformIO   $ newIORef []

main = do writeIORef  test [42] bang < readIORef  test print  (bang  ::  [Char])

Этот код вызовет аварийный останов программы из-за полиморфной ссылки, которая не вызовет никаких проблем при обычной работе в монаде IO. И нет лёгких путей для преодоления этой проблемы при использовании описанной функции.

Остаётся отметить, что ответственный за все модули пакета  Foreign  имеет иной адрес электронной почты, по которому  с ним  можно связаться для выяснения интересующих вопросов или для  внесения предложений. Этот адрес: ffi@haskell.org. Во всех нижеследующих описаниях эта информация опускается.

Источник: Душкин Р. В., Справочник по языку Haskell. М.: ДМК Пресс, 2008. 544 с., ил.

По теме:

  • Комментарии