remove Maybe

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

remove Maybe

Damien Mattei-2
i had filtered a [Maybe Text] type to remove Nothing from the list and now i want to put the result in a [Text] type but the compiler complains about the incompatible type :

 (bd_rows_WDS :: [Only (Maybe Text)]) <- query conn qry_head_WDS (Only (name::String))

-- remove the records having N°BD NULL
    let fltWDS :: [Only Text] = Prelude.filter (\(Only a) ->
                                    case a of
                                      Nothing -> False
                                      Just a -> True)
                 bd_rows_WDS

Prelude> :load UpdateSidonie
[1 of 1] Compiling Main             ( UpdateSidonie.hs, interpreted )

UpdateSidonie.hs:282:33: error:
    • Couldn't match type ‘Maybe Text’ with ‘Text’
      Expected type: [Only Text]
        Actual type: [Only (Maybe Text)]
    • In the expression:
        Prelude.filter
          (\ (Only a)
             -> case a of
                  Nothing -> False
                  Just a -> True)
          bd_rows_WDS
      In a pattern binding:
        fltWDS :: [Only Text]
          = Prelude.filter
              (\ (Only a)
                 -> case a of
                      Nothing -> False
                      Just a -> True)
              bd_rows_WDS
      In the expression:
        do conn <- connect
                     defaultConnectInfo
                       {connectHost = "moita", connectUser = "mattei",
                        connectPassword = "sidonie2", connectDatabase = "sidonie"}
           (rows :: [(Text, Double)]) <- query_
                                           conn
                                           "SELECT Nom,distance FROM AngularDistance WHERE distance > 0.000278"
           (names :: [Only Text]) <- query_
                                       conn
                                       "SELECT Nom FROM AngularDistance WHERE distance > 0.000278"
           let resLstNames = Prelude.map fromOnly names
           ....
    |
282 |     let fltWDS :: [Only Text] = Prelude.filter (\(Only a) ->
    |                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
Failed, no modules loaded.

how can id do the type conversion,now i'm sure there is no more Nothing values?


_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.
Reply | Threaded
Open this post in threaded view
|

Re: remove Maybe

Bob Ippolito
One way to figure out how to solve this problem is to search Hoogle for the type of function you’re looking for, in this case: [Maybe a] -> [a]

You’ll find that such a function exists in Data.Maybe and it is named catMaybes. No need to filter out Nothing separately, this function will do it. 

On Wed, Jan 2, 2019 at 20:08 Damien Mattei <[hidden email]> wrote:
i had filtered a [Maybe Text] type to remove Nothing from the list and now i want to put the result in a [Text] type but the compiler complains about the incompatible type :

 (bd_rows_WDS :: [Only (Maybe Text)]) <- query conn qry_head_WDS (Only (name::String))

-- remove the records having N°BD NULL
    let fltWDS :: [Only Text] = Prelude.filter (\(Only a) ->
                                    case a of
                                      Nothing -> False
                                      Just a -> True)
                 bd_rows_WDS

Prelude> :load UpdateSidonie
[1 of 1] Compiling Main             ( UpdateSidonie.hs, interpreted )

UpdateSidonie.hs:282:33: error:
    • Couldn't match type ‘Maybe Text’ with ‘Text’
      Expected type: [Only Text]
        Actual type: [Only (Maybe Text)]
    • In the expression:
        Prelude.filter
          (\ (Only a)
             -> case a of
                  Nothing -> False
                  Just a -> True)
          bd_rows_WDS
      In a pattern binding:
        fltWDS :: [Only Text]
          = Prelude.filter
              (\ (Only a)
                 -> case a of
                      Nothing -> False
                      Just a -> True)
              bd_rows_WDS
      In the expression:
        do conn <- connect
                     defaultConnectInfo
                       {connectHost = "moita", connectUser = "mattei",
                        connectPassword = "sidonie2", connectDatabase = "sidonie"}
           (rows :: [(Text, Double)]) <- query_
                                           conn
                                           "SELECT Nom,distance FROM AngularDistance WHERE distance > 0.000278"
           (names :: [Only Text]) <- query_
                                       conn
                                       "SELECT Nom FROM AngularDistance WHERE distance > 0.000278"
           let resLstNames = Prelude.map fromOnly names
           ....
    |
282 |     let fltWDS :: [Only Text] = Prelude.filter (\(Only a) ->
    |                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
Failed, no modules loaded.

how can id do the type conversion,now i'm sure there is no more Nothing values?

_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.

_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.