[Haskell-beginners] Help with some heavy lifting...

Bob Ippolito bob at redivi.com
Sun Mar 3 19:44:07 CET 2013

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 at 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<http://hackage.haskell.org/packages/archive/base/>)
> -> Vector<http://hackage.haskell.org/packages/archive/vector/>a ->
> Maybe<http://hackage.haskell.org/packages/archive/base/>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 at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20130303/6310cc75/attachment.htm>

More information about the Beginners mailing list