Gtk2Hs 바인딩을 사용하는 작은 Haskell 프로그램이 있습니다. 하나는 DrawingArea을 클릭하여 프로그램의 창에서 점 (작은 사각형)을 그릴 수 있습니다 :Gtk2H에서 EventM은 어떻게 작동합니까?
[...]
image <- builderGetObject gui castToDrawingArea "drawingarea"
p <- widgetGetDrawWindow image
gc <- gcNewWithValues p (newGCValues { foreground = Color 0 0 0,
function = Copy })
on image buttonPressEvent (point p gc)
set image [ widgetCanFocus := True ]
[...]
point :: DrawWindow -> GC -> EventM EButton Bool
point p gc = tryEvent $ do
(x', y') <- eventCoordinates
liftIO $ do
let x = round x'
let y = round y'
let relx = x `div` 4
let rely = y `div` 4
gcval <- gcGetValues gc
gcSetValues gc (newGCValues { function = Invert })
drawRectangle p gc True (relx * 4) (rely * 4) 4 4
gcSetValues gc gcval
시행 착오 방법을 통해 Hackage에서 문서를 읽은 후, 나는에 버튼을 눌러 이벤트를 추가 할 관리 그리기 영역은 위젯이 기본적으로이 이벤트에 대한 신호를 제공하지 않기 때문에 그러나 EventM의 정의와 사용법을 이해할 수 없으므로 새 이벤트를 위젯에 다시 추가해야하는 경우 EventM 모나드와 고민해야합니다. 나는 아직도 하스켈에서 충분히 능숙하지 못하다고 말한다. 나는 단순한 모나드가 작동하는 방법을 다소 이해하지만,이 하나의 "EventM t a = ReaderT (Ptr t) IO a"(Graphics.UI.Gtk.Gdk.EventM에 정의 됨)는 나에게 미스터 보인다.
제 질문은 : 누군가 EventM 모나드의 내부를 설명해 주시겠습니까? 예를 들어 "buttonPressEvent :: WidgetClass self => 신호 자체 (EventM EButton Bool)"의 경우입니다.
따라서 일부 상태는 ReaderT 모나드를 사용하여 암시 적으로 신호 처리기로 전달됩니다. 그렇습니까? 나는 이것을 이해하기 시작하고 있다고 생각합니다. Gtk2Hs 신호 처리 규칙이 일관성이없는 것 같습니다. –
나는 이렇게 생각한다. "모든 사건은 EventM 모나드의 기능을 통해 접근 할 수있는 추가적인 정보를 담고있다." 그래서 저는 국가가 암묵적으로 전달 될 것이라고 생각합니다. EventM은 이벤트의 정보에 액세스하는 데 사용됩니다. – realli