2010-05-12 12 views
1

Im en utilisant des tutoriels de wxHaskell et je veux afficher le contenu des films de table dans la grille. Voici mon code:Affichage du contenu de la base de données dans wxHaskell

{-------------------------------------------------------------------------------- 
    Test Grid. 
--------------------------------------------------------------------------------} 

module Main where 

import Graphics.UI.WX 
import Graphics.UI.WXCore hiding (Event) 

import Database.HDBC.Sqlite3 (connectSqlite3) 
import Database.HDBC 


main 
    = start gui 

gui :: IO() 
gui 
    = do f <- frame [text := "Grid test", visible := False] 

     -- grids 
     g <- gridCtrl f [] 
     gridSetGridLineColour g (colorSystem Color3DFace) 
     gridSetCellHighlightColour g black 
     appendColumns g (movies) -- Here is error: 

--  Couldn't match expected type `[String]' 
--  against inferred type `IO [[String]]' 


     --appendRows g (map show [1..length (tail movies)]) 
     --mapM_ (setRow g) (zip [0..] (tail movies)) 
     gridAutoSize g 

     -- layout 
     set f [layout := column 5 [fill (dynamic (widget g))] 
      ]  
     focusOn g 
     set f [visible := True] -- reduce flicker at startup. 
     return() 
    where 

    movies = do 
     conn <- connectSqlite3 "Spop.db" 
     r <- quickQuery' conn "SELECT id, title, year, description from Movie where id = 1" [] 
     let myResult = map convRow r 
     return myResult 

setRow g (row,values) 
    = mapM_ (\(col,value) -> gridSetCellValue g row col value) (zip [0..] values) 



{-------------------------------------------------------------------------------- 
    Library?f 
--------------------------------------------------------------------------------} 

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 

appendColumns :: Grid a -> [String] -> IO() 
appendColumns g [] 
    = return() 
appendColumns g labels 
    = do n <- gridGetNumberCols g 
     gridAppendCols g (length labels) True 
     mapM_ (\(i,label) -> gridSetColLabelValue g i label) (zip [n..] labels) 

appendRows :: Grid a -> [String] -> IO() 
appendRows g [] 
    = return() 
appendRows g labels 
    = do n <- gridGetNumberRows g 
     gridAppendRows g (length labels) True 
     mapM_ (\(i,label) -> gridSetRowLabelValue g i label) (zip [n..] labels) 

convRow :: [SqlValue] -> [String] 
convRow [sqlId, sqlTitle, sqlYear, sqlDescription] = [intid, title, year, description] 
       where intid = (fromSql sqlId)::String 
        title = (fromSql sqlTitle)::String 
        year = (fromSql sqlYear)::String 
        description = (fromSql sqlDescription)::String 

Que dois-je faire pour obtenir rif d'erreur dans le code ci-dessus (ligne 24)

Répondre

3

Le message d'erreur indique que appendColumns g attend une valeur de type [String], mais movies est de type IO [[String]].

Vous avez donc besoin de fixer deux choses:

  1. movies est un IO-action qui retourne une valeur, mais vous avez besoin de la valeur qu'elle retourne.

    Replace

    appendColumns g (movies) 
    

    avec

    movieList <- movies 
    appendColumns g movieList 
    

    (Soit dit en passant, les crochets dans la première ligne? Ils ne font rien.)

  2. Vous devez nourrir appendColumns g une liste de chaînes, mais vous essayez de lui donner une liste de listes de chaînes. Vous devez soit transformer la liste de listes en une liste de chaînes, soit attribuer successivement chaque liste de chaînes à appendColumns g.

    Je suppose que vous voulez ce dernier, donc vous obtenez une ligne à l'écran pour chaque ligne de la base de données. (Je ne suis pas familier avec wxhaskell, donc je peux mal comprendre ce appendColumns fait.)

    movieList <- movies 
    mapM_ (appendColumns g) movieList 
    
+0

Merci, maintenant il fonctionne très bien, mais j'ai une question: Comment savez-vous que les films est un IO action ? pourquoi si les films sont en action E/S puis x <- films x - isnt Le même type que les films? quelle est la différence entre = et <- Je ne comprends pas cela:/ – gruber

+0

Lire http://blog.sigfpe.com/2006/08/you-could-havent-invented-monads-and.html – dave4420