Кортежи «нельзя маршалировать во внешнем вызове» при попытке экспортировать функцию Haskell в C - PullRequest
3 голосов
/ 13 мая 2019

Я пытаюсь вызвать Haskell из C, используя Foreign.C.Types в Haskell, но он продолжает показывать эту ошибку в компиляторе:

  * Unacceptable argument type in foreign declaration:
        `(CInt, CInt)' cannot be marshalled in a foreign call
    * When checking declaration:
        foreign export ccall "func_hs" func_hs :: (CInt, CInt) -> CInt
   |
15 | foreign export ccall func_hs :: (CInt, CInt) -> CInt
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Точный код, скомпилированный GHCi версии 8.6.3:

{-# LANGUAGE ForeignFunctionInterface #-}

module Func where

import Foreign.C.Types

verify_hp :: (CInt, CInt) -> CInt

verify_hp (hp, maxHp) = if hp < maxHp then hp + 10 else maxHp

func_hs :: (CInt, CInt) -> CInt

func_hs (hp, maxHp) = if verify_hp(hp,maxHp) == hp + 10 && hp < maxHp then hp + 10 else maxHp


foreign export ccall func_hs :: (CInt, CInt) -> CInt

Почему это происходит и как я могу это исправить?

1 Ответ

5 голосов
/ 13 мая 2019

Вы не должны выводить аргументы экспортируемых функций.Используйте это вместо вашего func_hs, и оно будет работать нормально:

func_hs :: CInt -> CInt -> CInt

func_hs hp maxHp = if verify_hp(hp,maxHp) == hp + 10 && hp < maxHp then hp + 10 else maxHp


foreign export ccall func_hs :: CInt -> CInt -> CInt

В рабочей версии сигнатура C func_hs выглядит примерно так:

int func_hs(int hp, int maxHp);

В исходной нерабочей версии это должно выглядеть примерно так:

int func_hs(tuple<int, int> hp_and_maxHp); // not valid C!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...