Вашей декларации FFI нужна подпись типа
Иногда я сталкиваюсь со странной проблемой, рассмотрим следующие примеры:
Это компилирует:
renderFrame :: Frame -> Fay ()
renderFrame frame = do
stack <- getStack
if length stack > 0
then (do
let e = head stack
traceEventCoord e)
else (do return ())
reqFrame renderFrame
emptyStack
where traceEventCoord :: Event -> Fay ()
traceEventCoord e = do
eX <- pageX e
eY <- pageY e
let str = show eX ++ " x " ++ show eY
trace <- elById "trace"
if isNull trace
then return ()
else elSetHtml (fromNullable trace) str
pageX :: Event -> Fay Int
pageX = ffi "%1['pageX']"
pageY :: Event -> Fay Int
pageY = ffi "%1['pageY']"
Так же и это:
getParentGroups :: Fragment -> Fay [Fragment]
getParentGroups f = do
p <- getParent f
nn <- nodeName (fromNullable p)
return [fromNullable p]
getParent :: Fragment -> Fay (Nullable Fragment)
getParent = ffi "%1.parent()"
nodeName :: Fragment -> Fay String
nodeName = ffi "%1.node.nodeName"
Но если я помещу вспомогательные функции в пределах блока, у меня будет ошибка компиляции:
fay: your FFI declaration needs a type signature pageX = ffi "%1['pageX']"
fay: your FFI declaration needs a type signature: getParent = ffi "%1.parent()"
Например
-- ...
where traceEventCoord :: Event -> Fay ()
traceEventCoord e = do
eX <- pageX e
eY <- pageY e
let str = show eX ++ " x " ++ show eY
trace <- elById "trace"
if isNull trace
then return ()
else elSetHtml (fromNullable trace) str
pageX :: Event -> Fay Int
pageX = ffi "%1['pageX']"
pageY :: Event -> Fay Int
pageY = ffi "%1['pageY']"
а также
getParentGroups f = do
p <- getParent f
nn <- nodeName (fromNullable p)
return [fromNullable p]
where
getParent :: Fragment -> Fay (Nullable Fragment)
getParent = ffi "%1.parent()"
nodeName :: Fragment -> Fay String
nodeName = ffi "%1.node.nodeName"
Заметить, что traceEventCoords
в первом примере не вызывает эту проблему. Это ошибка?
PS Второй пример - всего лишь пример, и окончательный код будет немного реорганизован, но он имеет место для демонстрации.
1 ответ
Обновление: это было реализовано и выпущено в Фэй 0.19
Извините за задержку! Джетлаг достал меня:(
Я думаю, что это просто еще не было реализовано. Первоначально ffi поддерживался только на верхнем уровне, затем были добавлены выражения ffi, для которых требуется подпись типа рядом с выражением. ffi "alert('foo')" :: Fay ()
, Я не думаю, что кто-то когда-либо удосужился сделать это для того, где заявления также.