Re: [Haskell-beginners] Improve my FFI code please...

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? Edward, I am going to apply your comments over the weekend and see if I can truly understand them. I get the rough idea. Thanks guys. Sean.

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 --

On Fri, 21 Jan 2011 10:30:02 +0100, Henk-Jan van Tuyl
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
That should have been:
0 -> print 1
to be a proper example, but the result is identical. Regards, Henk-Jan van Tuyl -- http://Van.Tuyl.eu/ http://members.chello.nl/hjgtuyl/tourdemonad.html --

Excerpts from sean's message of Fri Jan 21 04:09:23 -0500 2011:
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?
A more direct answer is that you need to use a guard in this case: case x of x | x == nullPtr -> ... Or maybe in this case, using a regular conditional would be better. You can pattern match against constructors (things that are capitalized); variable names (lower-cased) will just assign new variables. Cheers, Edward

2011/1/21
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
It's not correct, pattern matching and equality testing is not the same thing. case handle of nullPtr -> return Nothing handle -> return (Just handle) here nullPtr and handle are new variables you introduce for pattern matching. naming one of them nullPtr is confusing because it's not trying to compare handle to nullPtr. it's basically saying: 1) if I can define nullPtr = handle, then return nothing 2) if I can define handle = handle, then return (Just handle) You see that in 1) you can always define nullPtr = handle, so the first case will always succeed. also in 2) it's a bit silly to pattern match a variable with a variable having the same name. if handle == nullPtr then return Nothing else return (Just handle) this is not the same thing, because here you test handle against nullPtr for equality, which implies nullPtr is already defined. David.
participants (4)
-
David Virebayre
-
Edward Z. Yang
-
Henk-Jan van Tuyl
-
sean@objitsu.com