Вы используете контексты неправильно.
C.context :: Context -> Q [Dec]
Он должен называться соединением верхнего уровня Template Haskell.Все, что вы сделали, - это определите
intializeMyCtx :: Q [Dec]
. Это действие Q
, которое будет инициализировать ваш контекст, если выполнится, но не .Итак, исправьте это:
type NotifyFuncT = FunPtr (Ptr C'WlListener -> Ptr () -> IO ())
C.context $ C.baseCtx <> C.funCtx <> mempty {
C.ctxTypesTable = Data.Map.fromList [
(C.Struct "wl_listener", [t|C'WlListener|])
-- ...
, (C.TypeName "wl_notify_func_t", [t|NotifyFuncT|])
]
}
Во-вторых, someHaskellFunction
немного сложнее.Если у вас есть более сложная функция, тогда C.block
может быть оправдано, но сейчас один C.exp
сделает все.
someHaskellFunction :: Ptr C'WlListener -> IO NotifyFuncT
someHaskellFunction ptr = [C.exp| wl_notify_func_t { $(struct wl_listener *ptr)->notify } |]