[Haskell-beginners] Learn You a Haskell! I have a few questions!

David McBride toad3k at gmail.com
Fri Apr 18 19:46:08 UTC 2014


> Are there safe versions anywhere, or do we have to define them ourselves?

There are some in the safe package.  Also some prelude replacements like
basic-prelude or classy-prelude that have their own renditions versions of
some functions.

> (The same question arises with the functions and and or, and their
boolean results, I think! Right?)

Product works for empty lists because 1 is a sensible answer and returning
maybe is cumbersome, so it does the sensible thing.  There are many times
where I use any or all and I want it to work for empty lists rather than
having to make my own version.  This same goes for sum.

> "a" to "z" then "aa" to "zz" then "aaa" to "zzz" and so on! Is it to
difficult or impossible to create a function that enumerates all possible
strings?

It is possible, but what should the successor to "john" be?  Should it be
"johN" or "joho"?  If there is more than one way to do a thing, it is
better to leave the instance off and allow the user to specify his order in
his own application.  You can see such api design decisions come to the
forefront in some modules like Data.Monoid where it could interpret
integers as monoids over sums, products, or a multitude of other ways.

> To make a list with all the numbers from 20 to 1, you can't just do
[20..1], you have to do [20,19..1].

It is that way because [20..1] desugars to enumFromTo 20 1, which chose to
do it that way.  Personally I'd be all for the change, but people have come
to depend on the way it is now, and so it is possible that code would break
if they changed it.

> Can anyone explain me why it works for the first few values, and not
"completely"?

The problem with enumerating floats is that floats don't actually represent
whole numbers well.  On the hardware level there is a lot of fudging
involved.  A lot of people think that having an enum instance for float is
a bad thing, but it is kept around because it can be useful sometimes.  I
actually agree with those people.


On Fri, Apr 18, 2014 at 11:12 AM, Gilberto Melfe <gilbertomelfe at gmail.com>wrote:

> Hi there to you all!
>
> I've been reading through the first chapter of "Learn You a Haskell" and
> I'd like to ask the community a few questions.
>
> Any help would be appreciated...
>
> -- ---------- ---------- ---------- ---------- ----------
>
> All the standard Prelude functions that throw out an error when fed the []!
>
> head
> maximum
> ...
>
> Are there safe versions anywhere, or do we have to define them ourselves?
>
> -- ---------- ---------- ---------- ---------- ----------
>
> This one is really important!
>
> I understand that for the definition of product to work as it is:
>   product [] must be equal to 1
>
> But what if we want to add a product to something else???
> Shouldn't the result be Nothing?
> (I guess we would have to guard against this! But we must guard against
> the parameter of product being the empty list, anyway. Otherwise we risk
> adding 1 when there is nothing do multiply)
>
> (The same question arises with the functions and and or, and their boolean
> results, I think! Right?)
>
> -- ---------- ---------- ---------- ---------- ----------
>
> -- ---------- Start Quote
>
> Names can't be enumerated. What comes after "John"? I don't know.
>
> -- ---------- End Quote
>
> "a" to "z" then "aa" to "zz" then "aaa" to "zzz" and so on! Is it to
> difficult or impossible to create a function that enumerates all possible
> strings?
>
> -- ---------- ---------- ---------- ---------- ----------
>
> -- ---------- Start Quote
>
> To make a list with all the numbers from 20 to 1, you can't just do
> [20..1], you have to do [20,19..1].
>
> -- ---------- End Quote
>
> Why is this? If the first was greater than the second it would just
> subtract! Right?
>
> -- ---------- ---------- ---------- ---------- ----------
>
> -- ---------- Start Quote
>
> Watch out when using floating point numbers in ranges! Because they are
> not completely precise (by definition), their use in ranges can yield some
> pretty funky results.
>
> ghci> [0.1, 0.3 .. 1]
> [0.1,0.3,0.5,0.7,0.8999999999999999,1.0999999999999999]
>
> -- ---------- End Quote
>
> Can anyone explain me why it works for the first few values, and not
> "completely"?
>
> -- ---------- ---------- ---------- ---------- ----------
>
> Any thoughts?
>
> Thank You Very Much in advance!
>
> Gilberto
>
> _______________________________________________
> 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/20140418/f2bce967/attachment-0001.html>


More information about the Beginners mailing list