Вашей декларации 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 (), Я не думаю, что кто-то когда-либо удосужился сделать это для того, где заявления также.

Другие вопросы по тегам