2010-05-11 9 views
0

Quelqu'un pourrait-il m'expliquer ce que ce code fait ligne par ligne?Haskell: grille dans wxHaskell

comment comprendre la première ligne avec déclaration? qu'est-ce que cela signifie: [Prop (Grid())]?

grâce à l'aide

gridCtrl :: Window a -> [Prop (Grid())] -> IO (Grid()) 
gridCtrl parent props 
    = feed2 props 0 $ 
    initialWindow $ \id rect -> \props flags -> 
    do g <- gridCreate parent id rect flags 
     gridCreateGrid g 0 0 0 
     set g props 
     return g 
+0

Veuillez lire le [Markdown formating reference] (http://stackoverflow.com/editing-help) et reformater votre code afin de le rendre plus lisible. –

Répondre

4

En wxHaskell, les contrôles ont des propriétés jointes qui peuvent être lus ou modifiés. La strophe [Prop (Grid())] peut être comprise comme "une liste de propriétés pour n'importe quel type de Grid".

C'est la manière de wxHaskell de gérer le fait que la bibliothèque wxWidgets sur laquelle elle est construite est orientée objet. Grille() signifie « quoi que ce soit dans la hiérarchie d'héritage dont la grille dérive » - à savoir la grille, ScrolledWindow, Panneau, Fenêtre, EvtHandler, wxObject (vous pouvez suivre ce travers si vous commencez à à http://wxhaskell.sourceforge.net/doc/Graphics-UI-WXCore-WxcClassTypes.html#204)

Quand vous regardez la documentation d'un contrôle (par exemple ListCtrl), vous trouverez qu'il est signalé comme ayant un ensemble d'attributs et d'instances. Fondamentalement, vous pouvez utiliser ceux qui s'appliquent à la hiérarchie pour Grid. Par exemple, la grille dérive de ScrolledWindow, vous pouvez donc utiliser:

  • Attribut scrollRate
  • Attributs de la classe de couleur par exemple bgcolor, couleur
  • etc.

Vous utilisez ces propriétés comme suit, par exemple

g <- gridCtrl parent [color := red, bgcolor := green, scrollRate := 41] 
... 
set g [color := blue] 

ligne par ligne, le code lit quelque chose comme ce qui suit:

  • En utilisant les propriétés fournies (des props)
  • et un initialWindow (qui remplira dans la fenêtre id et initiale rect et drapeaux), appelez le flotté enveloppé les fonctions de commande:
  • gridCreate pour créer une nouvelle instance de la grille
  • Utilisation de la nouvelle instance de la grille, la grille définies à l'intérieur avec des rangées 0, 0 colonnes et rien sélectionnés.
  • appliquer les propriétés (des accessoires) fournis par l'appelant dans le réseau (par exemple, placer les données dans les styles définis, etc.)

La partie qui rend le code plus difficile à lire est la fonction feed2 , et le fait que le code est écrit dans le style '$' pour fournir les paramètres corrects à feed2. Mon explication un peu en agitant la main au-dessus devrait être suffisant, mais si vous voulez comprendre les détails, comprendre que feed2 se compose juste application de fonction inversée

feed2 x y f = f x y 

puis remplacer les applications « $ » avec des parenthèses. Cela n'a pas l'air mignon, mais est plus facile à lire.

gridCtrl parent props = 
    feed2 props 0 
    (initialWindow (\id rect -> 
         \props flags -> 
         do 
         g <- gridCreate parent id rect flags 
         gridCreateGrid g 0 0 0 
         set g props 
         return g)))