Это довольно просто, используя GHC-iPhone и Интерфейс внешних функций
Для справки, у Дэвида Поллака есть пример реализации интерпретатора Lisp, написанный на Haskell, который запускается внутри приложения для iPad:
https://github.com/dpp/LispHaskellIPad
Пример объявления основной сети Haskell в main.m
:
extern int Haskell_main(int argc, char* argv[]);
int main(int argc, char* argv[])
{
Haskell_main(argc, argv);
}
и в его Main.hs
серии объявлений о внешних функциях, предоставляющих ему доступ к библиотекам Какао:
foreign import ccall safe "openWindow" openWindow
:: IO CInt
data ViewController_struct
type ViewController = Ptr ViewController_struct
type RunStr = ViewController -> CString -> IO ()
foreign import ccall safe "wrapper" wrapFuncInvoke :: RunStr -> IO (FunPtr RunStr)
foreign import ccall safe "setLispEval" setLispEval :: ViewController -> FunPtr RunStr -> IO ()
foreign import ccall safe "addToResult" addToResult :: ViewController -> CString -> IO ()
data ObjCId_struct
type ObjCId = Ptr ObjCId_struct
data ObjCSEL_struct
type ObjCSEL = Ptr ObjCSEL_struct
foreign import ccall safe "objc_msgSend" objc_msgSend :: ObjCId -> ObjCSEL -> IO ObjCId
foreign import ccall safe "objc_msgSend" objc_msgSendInt :: ObjCId -> ObjCSEL -> Int -> IO ObjCId
foreign import ccall safe "sel_registerName" sel_registerName :: CString -> IO ObjCSEL
foreign import ccall safe "objc_lookUpClass" objc_lookUpClass :: CString -> IO ObjCId