구조체를 사용하여 동일한 구조체를 반환하는 C 함수를 사용하기 위해 FFI를 사용하고 있습니다. 내가 본 레퍼런스는이 구조체를 하스켈로 가져 오기 위해이 구조체에 대한 포인터를 사용해야한다고 말한다. 그래서 예를 들면.하스켈 - FFI 및 포인터
data Bar = Bar { a :: Int, b :: Int }
type BarPtr = Ptr (Bar)
foreign import ccall "static foo.h foo"
f_foo :: BarPtr -> BarPtr
이제는이 기능을 사용할 수 있어야한다는 문제가 있습니다. references 나는 유형의 기능 BarPtr했다 보았다 -> IO() 및 서명 보관 가능한 A =>를 가지고있는,와 을 사용 - (-> IO의 B의 PTR A) ->를 확인했다 B> IO를, 왜냐하면 그들은 main 함수 내부에서 함수를 호출하기 때문입니다.
그러나, 나는 형 바의 기능을 점점 도서관에서이 기능을 포장하고 싶습니다 -> IO없이 바, 그것은 unsafePerformIO없이 할 수 있습니까? 절차가 뭐니?
경우 :
을하고 마지막으로
로 가져, 당신과이 수입 함수를 호출 할 것 'Ptr A -> IO()'와 같은 순수한 함수를 원한다면, 대응하는 C 함수는 by가 가리키는 메모리를 수정하는 것만 큼 의미있는 "거의 순수"해야합니다. 이 경우, Storable과'alloca'를 사용하여 C에 대한 포인터를 생성 한 다음 그 포인터에서 읽고 값을 반환함으로써'A -> A '유형의 함수를 작성합니다. 이 함수는 관찰 할 수있는 효과가 없으므로 도덕적으로 순수하므로'unsafePerformIO'를 호출하는 것이 완벽합니다 (사실 이것은 unsafePerformIO의 의도 된 사용입니다) – user2407038