Hi Bob,

I can't see how this helps my situation though because V.find expects the predicate to be pure. My predicate requires "IO" as it calls two functions that dip into the USB device structure.

Have I missed something here???

Thanks
Sean


On 3 March 2013 18:44, Bob Ippolito <bob@redivi.com> wrote:
I don't know what the performance would look like, but you can freeze the mutable Vector and then just use find. Here's an example:

import qualified Data.Vector.Mutable as M
import qualified Data.Vector as V
main :: IO ()
main = do
  v <- M.replicate 10 'a'
  M.write v 2 'b'
  V.freeze v >>= print . V.find (=='b')



On Sun, Mar 3, 2013 at 10:28 AM, emacstheviking <objitsu@gmail.com> wrote:
I now have a working USB application that can find, locate and switch LED-s on and off on my Hexwax board, for which I thank all those that helped me out last week.

I am now trying to "Haskell-ise" my code i.e. make it less amateurish with respect to some of its inner workings in a constant drive for inner cleanliness and warm fuzziness etc.

When attempting to find the device, I use the System.USB.getDevices function which returns me IO (Vector Device), a list of everything that's currently plugged in and available and I then use Data.Vector.filterM like so:

handleFor ctx (cVendor, cProd) = do
    usbDevs <- getDevices ctx
    matches <- V.filterM (isTarget (cVendor, cProd)) usbDevs
    case V.null matches of
      True  -> return Nothing
      False -> return $ Just $ matches!


isTarget :: (Word16, Word16) -> Device -> IO Bool
isTarget (vid, pid) dev = do
  getDeviceDesc dev >>= \info ->
    return $ (deviceVendorId info, deviceProductId info) == (vid, pid)


but... that is not as efficient as it could be because I could have N devices and then I just throw all but the first. Tut tut. Could do better. If I knew how... well I kind of do but I can't figure it out by myself yet!

In the Data.Vector there is "Data.Vector.find" which is *exactly* what I want with small dent in the bodywork, the predicate function is pure:

find :: (a -> Bool) -> Vector a -> Maybe a

So my question is, how do I make it work? I know (but don't yet feel comfortable with) about liftM and all that but in this case I can't see how and where it would work. I "know" (like Spiderman knows there is danger) that it's crying out for something and the return type is perfect too as it would just match.

SO...how can I do it chaps?

And as usual... .any comments, style notes, idiomatic pointers(!) etc. are always welcome.

Thanks,
Sean Charles.


_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://www.haskell.org/mailman/listinfo/beginners



_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://www.haskell.org/mailman/listinfo/beginners