Foreign.Marshal

Foreign.Marshal

마샬링(marshalling) 하위 모듈들을 한데 다시 내보내고, 순수 함수로 포장할 수 있게 해주는 unsafeLocalState 유틸리티를 제공하는 모듈이에요.

출처: Haskell 2010 언어 리포트

본문

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.Alloc
  • Foreign.Marshal.Array
  • Foreign.Marshal.Error
  • Foreign.Marshal.Utils

그리고 하나의 함수를 제공해요.

unsafeLocalState :: IO a -> a

가끔 외부 개체가 순수 함수(pure function)인데, 인자 및/또는 결과를 포인터를 통해 전달할 때가 있어요. unsafeLocalState 함수는 그러한 개체를 순수 함수로 포장하는 것을 허용해요.

unsafeLocalState에 전달되는 IO 액션에서 허용되는 유일한 IO 연산은 (a) 로컬 할당(alloca, allocaBytes, 그리고 withArray, withCString 같은 파생 연산)과, (b) 로컬 저장 공간을 가리키는 포인터에 대한 포인터 연산(Foreign.StorableForeign.Ptr), 그리고 (c) 관찰 가능한 효과가 로컬로 할당된 메모리를 읽고/쓰는 것뿐인 외국 함수들이에요. 이 규칙들을 따르지 않는 IO 연산을 전달하면 동작이 정의되지 않아요.

이 연산은 향후 Haskell 개정판에서 교체될 것으로 예상돼요.

더 알아보기 (Learn more)

  • 할당을 위한 Foreign.Marshal.Alloc31장에서 다뤄요.
  • 배열 처리를 위한 Foreign.Marshal.Array32장에서 다뤄요.
  • 오류 처리를 위한 Foreign.Marshal.Error33장에서 다뤄요.