[Haskell-beginners] filterM function
Alexey Shmalko
rasen.dubi at gmail.com
Wed Apr 22 12:22:35 UTC 2015
I see misunderstand comes from
flg <- p x
In fact in the following code flg has type Bool:
flg <- [True, False]
For lists, >>= (and therefore <-) assigns every value out of list to
flg and tries to proceed. The final `return` returns only a single
element out of result, and all the results are concatenated together.
On Wed, Apr 22, 2015 at 12:22 PM, Shishir Srivastava
<shishir.srivastava at gmail.com> wrote:
> Hi Mike,
>
> Thanks for your response. I was aware that 'casting' doesn't really fit in
> Haskell vocab but for the lack of better word used it.
>
> My question was however more towards the usage of [Bool] in the 'if'
> statement of the filterM function.
>
> More precisely - How does 'if [True, False] then x else y' work , because
> when I do this in GHCi it throws up the following error ?
>
>>>Couldn't match expected type `Bool' with actual type `[Bool]'
>
> Clearly the 'if' construct does not take a list of Boolean but a single
> Boolean value so how does filterM use it in it's implementation.
>
> Hope have made myself clear this time.
>
> Thanks,
> Shishir
>
>
>>
>> From: Mike Meyer <mwm at mired.org>
>> To: The Haskell-Beginners Mailing List - Discussion of primarily
>> beginner-level topics related to Haskell <beginners at haskell.org>
>> Cc:
>> Date: Wed, 22 Apr 2015 04:15:31 -0500
>> Subject: Re: [Haskell-beginners] filterM function
>>
>> On Wed, Apr 22, 2015 at 3:31 AM, Shishir Srivastava
>> <shishir.srivastava at 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.
>>
>> _______________________________________________
>> Beginners mailing list
>> Beginners at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>
>
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
More information about the Beginners
mailing list