[Haskell-cafe] WG:
Francesco Ariis
fa-ml at ariis.it
Wed Aug 15 21:27:29 UTC 2018
Hello Steafan,
On Wed, Aug 15, 2018 at 09:06:40PM +0000, Stefan Chacko wrote:
> 1. What is the use of making definitions compared to having no
> definitions? Is it just like a comment for documation or does it really
> make a difference in compiling the code?
Writing signatures is always useful:
- to prototype (and let the compiler complain about wrong types)
- to restrict a function to some types only, e.g.
intHead :: [Int] -> Int
intHead is = head is
- to have an immediate, clear, verifiable documentation near the
functions
> 2. What does the arrow(->) mean in such a definition? [...]
> For example there is sumWithL :: [Int] -> Int -> Int
`[Int] -> Int -> Int` can be (with great approximation) be read
"this function takes two arguments, `[Int]` and `Int`, to return
an `Int`.
More precisely, if you provide `[Int]` you'll get back a function
that takes an Int to return one Int (Int -> Int), and if you
(finally) pass an Int to that, you receive the final result.
> 1. Why do we use clinches in such definitions. I concluded
> you need clinches if a function is not associative
(->) (called `function application`) associates to the right, so
sumWithL :: [Int] -> Int -> Int
is equal to
sumWithL :: [Int] -> (Int -> Int)
If you want a function that takes a function `[Int] -> Int` to return
an Int you got to put parentheses:
sumWithL :: ([Int] -> Int) -> Int
Hope it was clear!
-F
p.s. haskell at haskell.org is for announcements only, so I am removing it
from cc.
More information about the Haskell-Cafe
mailing list