すみません、ちょっと詰まってしまったので質問させてください。
FreeBSD(12.1)上でncursesパッケージをビルドすると以下のようなエラーメッセージが出ます。
(Ver 0.2.16)
> >> cabal build
(略)
[4 of 5] Compiling UI.NCurses ( dist/build/UI/NCurses.hs, dist/build/UI/NCurses.o )
> lib/UI/NCurses.chs:442:27: error:
> * Couldn't match type `CWchar' with `CInt'
> Expected type: CWString -> IO CInt
> Actual type: Ptr CInt -> IO CInt
> * In the second argument of `withCWString', namely `(waddwstr win)'
> In the expression: withCWString str (waddwstr win)
> In the second argument of `($)', namely
> `\ win -> withCWString str (waddwstr win)'
> |
> 442 | withCWString str ({# call waddwstr #} win)
> | ^^^^^^^^^^^^
>
> lib/UI/NCurses.chs:447:38: error:
> * Couldn't match type `CWchar' with `CInt'
> Expected type: CWString -> IO CInt
> Actual type: Ptr CInt -> IO CInt
> * In the second argument of `withCWString', namely `(waddwstr win)'
> In the expression: withCWString (T.unpack txt) (waddwstr win)
> In the second argument of `($)', namely
> `\ win -> withCWString (T.unpack txt) (waddwstr win)'
> |
> 447 | withCWString (T.unpack txt) ({# call waddwstr #} win)
> | ^^^^^^^^^^^^
>
> lib/UI/NCurses.chs:725:53: error:
> * Couldn't match type `CWchar' with `CInt'
> Expected type: Ptr CInt
> Actual type: Ptr CWchar
> * In the third argument of `hsncurses_init_cchar_t', namely
> `cChars'
> In a stmt of a 'do' block:
> hsncurses_init_cchar_t
> (CCharT pBuf) cAttrs cChars (fromIntegral cCharsLen)
> In the expression:
> do hsncurses_init_cchar_t
> (CCharT pBuf) cAttrs cChars (fromIntegral cCharsLen)
> io (CCharT pBuf)
> |
> 725 | {# call hsncurses_init_cchar_t #} (CCharT pBuf) cAttrs cChars (fromIntegral cCharsLen)
> |
エラーメッセージにあるとおり、引数の型が合わないことが原因のようです。
FFIで呼び出すC言語の関数waddwstrはヘッダファイル(ncurses.h)では
extern NCURSES_EXPORT(int) waddwstr(WINDOW *,const wchar_t *);のように宣言されています。
しかし、c2hsでNCurses.chsがNCurses.hsファイルに展開されると
foreign import ccall safe "UI/NCurses.chs.h waddwstr"
waddwstr :: ((Window) -> ((C2HSImp.Ptr C2HSImp.CInt) -> (IO C2HSImp.CInt)))
となってしまいます。
どのあたりを確認すべきか、何かアドバイスがありましたら宜しくお願いします