
Hi, Continuing on from my previous question about powerset using filterM - Thanks to Alexey and Chaddaï. filterM is implemented as below - ---- filterM _ [] = return [] filterM p (x:xs) = do flg <- p x ys <- filterM p xs return (if flg then x:ys else ys) --- I still don't quite understand how 'flg' being a boolean [] is used in the last 'if statement' of implementation because when I try to do the same thing outside in GHCi it fails miserably even though I am casting it to [Int] - -- return (if [True, False] then "4" else "3")::[Int] -- Offtopic : Also if someone can explain how do I reply to individual mails/responses to my queries because I only get a digest on my gmail and there is no way to isolate and reply to individual mails either this list's page or from digest. Thanks, Shishir

On 22 April 2015 at 10:31, Shishir Srivastava
Hi,
Continuing on from my previous question about powerset using filterM - Thanks to Alexey and Chaddaï.
filterM is implemented as below -
----
filterM _ [] = return [] filterM p (x:xs) = do flg <- p x ys <- filterM p xs return (if flg then x:ys else ys)
---
I still don't quite understand how 'flg' being a boolean [] is used in the last 'if statement' of implementation because when I try to do the same thing outside in GHCi it fails miserably even though I am casting it to [Int] -
-- return (if [True, False] then "4" else "3")::[Int] --
`flg` has type `Bool`, not `[Bool]`.
Offtopic : Also if someone can explain how do I reply to individual mails/responses to my queries because I only get a digest on my gmail and there is no way to isolate and reply to individual mails either this list's page or from digest.
I suspect you'll have to go to the list server and modify your settings there; it sounds like you have instructed it to send digests, so you need to change it to send every individual email. Alternatively you switch to a more capable mail reader, e.g. mutt, which handles digests better than gmail does. /M -- Magnus Therning OpenPGP: 0xAB4DFBA4 email: magnus@therning.org jabber: magnus@therning.org twitter: magthe http://therning.org/magnus

On Wed, Apr 22, 2015 at 3:31 AM, Shishir Srivastava < shishir.srivastava@gmail.com> wrote:
I still don't quite understand how 'flg' being a boolean [] is used in the last 'if statement' of implementation because when I try to do the same thing outside in GHCi it fails miserably even though I am casting it to [Int] -
-- return (if [True, False] then "4" else "3")::[Int]
"cast" is a misnomer in Haskell. When you add a type to an expression, you aren't changing the type of the expression like a C-style cast, but picking out a type from the set of possible types for that expression. Ignoring the if part and and focusing on return, which has a type Monad m => a -> m a. [Int] is equivalent to [] Int, so [] would be the Monad, and a is Int. While 3 can be an Int, "3", can't. So you could do return 3 :: [Int] or equivalently return 3 :: [] Int to get [3], you can't do return "3" :: [Int], because "3" can't be an Int. You can do return "3" :: [String], since "3" is a string. Just to show the range of possibilities, you can do return 3 :: IO Float, and get back 3.0 as an IO action. The monad in the type is IO, and 3 can be interpreted as a Float.
participants (3)
-
Magnus Therning
-
Mike Meyer
-
Shishir Srivastava