3

奇妙な問題に直面することがあります。次の例を検討してください。

これはコンパイルされます:

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"

しかし、補助関数を where ブロック内に配置すると、コンパイル エラーが発生します。

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 2番目の例は単なる例であり、最終的なコードは少しリファクタリングされますが、実証目的のために保持されます.

4

1 に答える 1

1

更新:これは実装され、fay 0.19 でリリースされました。

遅れて申し訳ありません!時差ぼけは私を手に入れました:(

これはまだ実装されていないと思います。最初は ffi は最上位でのみサポートされていましたが、その後、式の横に型シグネチャを必要とする ffi 式が追加されましたffi "alert('foo')" :: Fay ()。whereステートメントについても、誰もそれをやろうとしたことはないと思います。

于 2014-01-06T15:55:38.290 に答える