Foreign.Marshal
Foreign.Marshal
마샬링(marshalling) 하위 모듈들을 한데 다시 내보내고, 순수 함수로 포장할 수 있게 해주는 unsafeLocalState 유틸리티를 제공하는 모듈이에요.
본문
module Foreign.Marshal (
module Foreign.Marshal.Alloc, module Foreign.Marshal.Array,
module Foreign.Marshal.Error, module Foreign.Marshal.Utils,
unsafeLocalState
) where
Foreign.Marshal 모듈은 Foreign.Marshal 계층 구조의 다른 모듈들을 다시 내보내요.
Foreign.Marshal.AllocForeign.Marshal.ArrayForeign.Marshal.ErrorForeign.Marshal.Utils
그리고 하나의 함수를 제공해요.
unsafeLocalState :: IO a -> a
가끔 외부 개체가 순수 함수(pure function)인데, 인자 및/또는 결과를 포인터를 통해 전달할 때가 있어요. unsafeLocalState 함수는 그러한 개체를 순수 함수로 포장하는 것을 허용해요.
unsafeLocalState에 전달되는 IO 액션에서 허용되는 유일한 IO 연산은 (a) 로컬 할당(alloca, allocaBytes, 그리고 withArray, withCString 같은 파생 연산)과, (b) 로컬 저장 공간을 가리키는 포인터에 대한 포인터 연산(Foreign.Storable과 Foreign.Ptr), 그리고 (c) 관찰 가능한 효과가 로컬로 할당된 메모리를 읽고/쓰는 것뿐인 외국 함수들이에요. 이 규칙들을 따르지 않는 IO 연산을 전달하면 동작이 정의되지 않아요.
이 연산은 향후 Haskell 개정판에서 교체될 것으로 예상돼요.