
On Fri, 21 Jan 2011 10:09:23 +0100,
Edward, Daniel, thanks.
On Friday 21 January 2011 00:35:02, Sean Charles wrote: wiiOpen :: String -> IO (Maybe (Ptr Word8)) wiiOpen wid = do ? ?handle <- withCString wid c_wiimote_open ? ?case handle of ? ? ?nullPtr -> return Nothing ? ? ?handle -> return (Just handle) Unless nullPtr is a macro that gets replaced with a literal by the preprocessor, that won't do what you want. "nullPtr" is a generic name and matches everything, so you'll always take the first branch (with -Wall, ghc should warn about overlapping patterns in that case).
Daniel, you have confused me. In my RWH book there is a test from the PCRE example of nullPtr == x, so I just did my code using a case instead, I am sure it's correct!?!?!? If I run my program with the Wiimote off, it prints FAIL and if I press the red sync. button it then prints out OK and the memory address of the allocated structure so it surely must be workng as I expected?
Anybody?
The Haskell 2010 Language Report[0] says that case expressions work with patterns; the nullPtr is regarded as a pattern that matches anything. It can be demonstrated by the following: Program Case.lhs:
c = 1
f = case 0 of c -> print 0 1 -> print 1
GHCi session: Prelude> :load "Case.lhs" [1 of 1] Compiling Main ( Case.lhs, interpreted ) Case.lhs:8:4: Warning: Pattern match(es) are overlapped In a case alternative: 1 -> ... Ok, modules loaded: Main. *Main> f 0 If the c in the case expression was a constant, f would have printed 0 Regards, Henk-Jan van Tuyl [0] http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-460003.13 -- http://Van.Tuyl.eu/ http://members.chello.nl/hjgtuyl/tourdemonad.html --