Send Beginners mailing list submissions to
        beginners@haskell.org

To subscribe or unsubscribe via the World Wide Web, visit
        http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
        beginners-requ...@haskell.org

You can reach the person managing the list at
        beginners-ow...@haskell.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."


Today's Topics:

   1. Re:  Nested folds (Francesco Ariis)
   2. Re:  Nested folds (Pietro Grandinetti)
   3. Re:  Nested folds (Francesco Ariis)


----------------------------------------------------------------------

Message: 1
Date: Sun, 13 Dec 2020 18:25:03 +0100
From: Francesco Ariis <fa...@ariis.it>
To: beginners@haskell.org
Subject: Re: [Haskell-beginners] Nested folds
Message-ID: <20201213172503.GA22875@extensa>
Content-Type: text/plain; charset=utf-8

Hello Pietro,

Il 13 dicembre 2020 alle 10:39 Pietro Grandinetti ha scritto:
> Hello,
> I have a piece of code to represents Sentences, Paragraphs and the Content of 
> an article. I added functions to count the words, code below. My questions:
> 
> […]
> 
> I also have two more practical questions on the following two functions:
> 
> makeSentence :: String -> Sentence
> makeSentence x = x::Sentence

You can omit the `:: Sentence` part, since it is specified in the
signature above. You can omit the whole function itself to be fair,
Sentence is a type synonym!

> sentCharCount :: Sentence -> Int
> sentCharCount x = length $ filter (/= ' ') x

You can write this point-free like this

    sentCharCount :: Sentence -> Int
    sentCharCount = length . filter (/= ' ')

In this example you can regard `$` as «evaluate everything on the right
before anything else», so

    length $ filter (/= ' ')
    ^^^^^^   ^^^^^^^^^^^^^^^
      |            |
      |            |
      |            +-- this has type :: [Char] -> [Char]
      |
      +-- length does not work on `[Char] -> [Char]`

`.` instead is appropriate

    λ> :t (.)
    (.) :: (b -> c) -> (a -> b) -> a -> c

Does this clear your doubts?
—F


------------------------------

Message: 2
Date: Sun, 13 Dec 2020 19:04:08 +0000
From: Pietro Grandinetti <pietro....@hotmail.it>
To: "beginners@haskell.org" <beginners@haskell.org>
Subject: Re: [Haskell-beginners] Nested folds
Message-ID:
        
<pr2pr09mb30031885a6f7e5d06cb40c27fc...@pr2pr09mb3003.eurprd09.prod.outlook.com>
        
Content-Type: text/plain; charset="cp1253"

Hello Francesco,

Yes, that helped. However, I believe I shouldn't remove the `makeSentence`. A 
user of the module is not supposed to know what a `Sentence` is, hence I must 
provide a function such as `makeSentence`. Right now, its implementation is 
just a type conversion, but may change later.
This would be my logic in different languages; does it make sense in Haskell?

Do you have any feedback on my questions 1,2 and 3?

Thanks,
-P

________________________________
From: Beginners <beginners-boun...@haskell.org> on behalf of Francesco Ariis 
<fa...@ariis.it>
Sent: Sunday, December 13, 2020 6:25 PM
To: beginners@haskell.org <beginners@haskell.org>
Subject: Re: [Haskell-beginners] Nested folds

Hello Pietro,

Il 13 dicembre 2020 alle 10:39 Pietro Grandinetti ha scritto:
> Hello,
> I have a piece of code to represents Sentences, Paragraphs and the Content of 
> an article. I added functions to count the words, code below. My questions:
>
> […]
>
> I also have two more practical questions on the following two functions:
>
> makeSentence :: String -> Sentence
> makeSentence x = x::Sentence

You can omit the `:: Sentence` part, since it is specified in the
signature above. You can omit the whole function itself to be fair,
Sentence is a type synonym!

> sentCharCount :: Sentence -> Int
> sentCharCount x = length $ filter (/= ' ') x

You can write this point-free like this

    sentCharCount :: Sentence -> Int
    sentCharCount = length . filter (/= ' ')

In this example you can regard `$` as «evaluate everything on the right
before anything else», so

    length $ filter (/= ' ')
    ^^^^^^   ^^^^^^^^^^^^^^^
      |            |
      |            |
      |            +-- this has type :: [Char] -> [Char]
      |
      +-- length does not work on `[Char] -> [Char]`

`.` instead is appropriate

    λ> :t (.)
    (.) :: (b -> c) -> (a -> b) -> a -> c

Does this clear your doubts?
—F
_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://mail.haskell.org/pipermail/beginners/attachments/20201213/a216edbe/attachment-0001.html>

------------------------------

Message: 3
Date: Sun, 13 Dec 2020 23:47:42 +0100
From: Francesco Ariis <fa...@ariis.it>
To: beginners@haskell.org
Subject: Re: [Haskell-beginners] Nested folds
Message-ID: <20201213224742.GB22522@extensa>
Content-Type: text/plain; charset=utf-8

Il 13 dicembre 2020 alle 19:04 Pietro Grandinetti ha scritto:
> Yes, that helped. However, I believe I shouldn't remove the `makeSentence`.
> A user of the module is not supposed to know what a `Sentence` is, hence I
> must provide a function such as `makeSentence`.

But they will know, a type synonym is just a way to make signatures
prettier/more informative, a program like this

    foo :: String
    foo = "foo"

    k = sentCharCount foo

will _not_ be refused by the compiler. IF and when — in the future — you
decide to use newtype/data then you will get a compiler error (and in turn
would need a constructor with signature `:: String -> Sentence`.

> Do you have any feedback on my questions 1,2 and 3?

The functions are clearly written, there is some duplication because of
the type synonyms (i.e. `parWordCount` and `contWordCount` are the same
function).
Do not worry about it now and revisit the exercise once you start
using `newtype` and `data` + typeclasses
—F



------------------------------

Subject: Digest Footer

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners


------------------------------

End of Beginners Digest, Vol 149, Issue 7
*****************************************

Reply via email to