2014-01-03 1 views
2

Иногда я сталкиваюсь с странным вопросом, рассмотрим следующие примеры:ваше объявление 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()"

E.g.

-- ... 
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 в первом примере, не вызывает эту проблему. Это ошибка?

P.S. Второй пример - это просто пример, и окончательный код будет реорганизован немного, но он имеет смысл для демонстрационной цели.

ответ

0

Update: Это было реализовано и выпущено в Fay 0,19

Извините за задержку! Jetlag получил меня :(

Я думаю, что это еще не реализовано. Изначально ffi поддерживался только на верхнем уровне, затем были добавлены выражения ffi, которым нужна подпись типа рядом с выражением ffi "alert('foo')" :: Fay(). думаю, что кто-то когда-либо обходился, чтобы делать это для каких-либо заявлений.