Я пытаюсь реализовать часть FFI для моего codegen, и хотя передача значений типа Int
работает, моя самая большая проблема - выяснить, как передать функцию.
Итак, в в документах есть этот пример с JS FFI , который передает функцию в мир JS, вызывает ее и возвращает результат, что я и пытаюсь реализовать. Код в документации выглядит следующим образом:
function twice(f, x) {
return f(f(x));
}
, а код Idris для привязки FFI следующий:
twice : (Int -> Int) -> Int -> IO Int
twice f x = mkForeign (
FFun "twice(%0,%1)" [FFunction FInt FInt, FInt] FInt
) f x
У меня нет доступа к функции mkForeign
потому что, похоже, это из JS codegen RTS. Поэтому я попытался использовать foreign
из встроенных Idris:
twice : (Int -> Int) -> Int -> IO Int
twice =
foreign FFI_AHK "twice"
((Int -> Int) -> Int -> IO Int)
Какие ошибки в:
When checking right hand side of twice with expected type
(Int -> Int) -> Int -> IO Int
When checking argument fty to function foreign:
Can't find a value of type
FTy FFI_AHK [] ((Int -> Int) -> Int -> IO Int)
Что, я думаю, связано с последним параметром foreign
, который имеет тип
{auto fty : FTy f [] ty}
Документируется как:
fty - автоматически найденное доказательство того, что тип Idris работает с рассматриваемым FFI
Как можно удовлетворить это доказательство? Я довольно потерян в этот момент