Send Beginners mailing list submissions to
        beginners@haskell.org

To subscribe or unsubscribe via the World Wide Web, visit
        http://www.haskell.org/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: let indenting problems (Heinrich Apfelmus)
   2.  infix and bind pseudonym (Michael Easter)
   3.  basic threading (Michael Easter)
   4. Re:  infix and bind pseudonym (Magnus Therning)
   5. Re:  infix and bind pseudonym (Daniel Fischer)
   6. Re:  infix and bind pseudonym (Daniel Fischer)
   7. Re:  basic threading (Thomas Davie)
   8. Re:  basic threading (Henk-Jan van Tuyl)


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

Message: 1
Date: Tue, 03 Mar 2009 12:20:45 +0100
From: Heinrich Apfelmus <apfel...@quantentunnel.de>
Subject: [Haskell-beginners] Re: let indenting problems
To: beginners@haskell.org
Message-ID: <goj3og$ba...@ger.gmane.org>
Content-Type: text/plain; charset=ISO-8859-1

7stud wrote:
> Heinrich Apfelmus <apfelmus <at> quantentunnel.de> writes:
>> How about
>>
>>    import Data.Ord (comparing)
>>
>>    mySort = sortBy (comparing length)
>>
> 
> I just finished chap. 3 of Real World Haskell, which doesn't 
> even imports.  It took me hours to figure out how to 
> access sortBy.  The book hasn't introduced "comparing", yet.

It's a handy little function for exactly this sort of thing. It's defined as

   comparing p x y = compare (p x) (p y)

See also

   http://haskell.org/hoogle/?q=comparing


>> or at least
>>
>>    mySort = sortBy myCompare
>>        where
>>        myCompare x y = compare (length x) (length y)
>>
> 
> Very nice.  The book mentioned the compare function in 
> chap. 2.  
> 
> I have a question about that code: how come you
> don't have to specify a parameter for mySort, for example:
> 
> mySort xs = ...
> 
> And doesn't sortBy require two arguments?
> 
> sortBy :: (a -> a -> Ordering) -> [a] -> [a]
>                  (1)              (2)
> 
> How come you can write it with only one argument?

You can supply arguments one at a time, this is called "currying". In
other words, the expression  sortBy myCompare  is created by supplying
one argument to  sortBy  and thus has one argument remaining. More
specifically, it has the type

  sortBy myCompare :: [[a]] -> [[a]]

Furthermore, we can simply set

  mySort = sortBy myCompare

and the left hand side will be a function with one argument just like
the right hand side is.


> Finally, I'm wondering if anyone can explain why my
> let examples failed?

Your use of  let  in conjunction with  where  was not syntactically
correct. While both are used for declaring new things,  let  is an
expression while  where  is a declaration, these two don't mix.

In particular,  let  must always have the form

  let
     x = ...
     y = ...
     ...
  in expr

while  where  is used like this

  foo x y
     | ... = expr1
     | ... = expr2
     where
     a = ...
     b = ...
     ...

Construction like

   let ... in where ...
   let ... in | ...

do not exist, there is no expression after the  in  . I suggest
consulting a syntax reference for Haskell or using  where  only for the
time being.


Regards,
apfelmus

--
http://apfelmus.nfshost.com



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

Message: 2
Date: Wed, 4 Mar 2009 06:25:06 -0600
From: Michael Easter <codeto...@gmail.com>
Subject: [Haskell-beginners] infix and bind pseudonym
To: beginners@haskell.org
Message-ID:
        <1d393c9d0903040425y77cf2c65n2ea9f5ae4a5fb...@mail.gmail.com>
Content-Type: text/plain; charset="iso-8859-1"

Folks,

I have a simple type called Beverage and an example that allows me to
construct Maybe Beverage types.

Here are some type signatures for example functions:

request :: String -> Maybe Beverage

addMalt :: Beverage -> Maybe Beverage

I have defined a chain function like so:

chain :: (Maybe a) -> (a -> Maybe b) -> (Maybe b)
chain = (>>=)

I can do this:

(chain (request "beer") addMalt)

and

request "beer" `chain` addMalt

I think I understand why, as I use the back-ticks for infix.

However, I don't have to do that for the true bind function, (>>=)

request "beer" >>= addMalt

I would like to use chain in this way -- that is without back-ticks.  I'm
not sure how...

Is there something I'm missing?

thanks
Mike

ps. Thanks to everyone for the great discussion on IO (re: previous
question)

-- 
----------------------
Michael Easter
http://codetojoy.blogspot.com: Putting the thrill back in blog

http://youtube.com/ocitv -> Fun people doing serious software engineering
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
http://www.haskell.org/pipermail/beginners/attachments/20090304/9f5050a2/attachment-0001.htm

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

Message: 3
Date: Wed, 4 Mar 2009 06:33:37 -0600
From: Michael Easter <codeto...@gmail.com>
Subject: [Haskell-beginners] basic threading
To: beginners@haskell.org
Message-ID:
        <1d393c9d0903040433q3171cf31v7190f8ecca732...@mail.gmail.com>
Content-Type: text/plain; charset="iso-8859-1"

hi again everyone,

I am giving a tech talk soon, and aspire to show an example from Chapter 28
of RWH on the STM monad.

My example is just a watered down version of the "transfer wealth" example
in the book.  However it is
single threaded.

Q: is there an "easy" example of illustrating 2 threads that do something
(trivial is fine)? I believe that the book constructs a
thread library/manager of sorts but I wonder if there is something easier.

Though I'm not sure how to square this with my example, for now I'd love to
see an example of starting up
2 threads that do something and block until a keystroke is entered in the
terminal.

My apologies if this is too vague or too much "can you do my homework?" !

thanks
Michael

-- 
----------------------
Michael Easter
http://codetojoy.blogspot.com: Putting the thrill back in blog

http://youtube.com/ocitv -> Fun people doing serious software engineering
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
http://www.haskell.org/pipermail/beginners/attachments/20090304/3fd091d8/attachment-0001.htm

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

Message: 4
Date: Wed, 4 Mar 2009 12:59:58 +0000
From: Magnus Therning <mag...@therning.org>
Subject: Re: [Haskell-beginners] infix and bind pseudonym
To: Michael Easter <codeto...@gmail.com>
Cc: beginners@haskell.org
Message-ID:
        <e040b520903040459l15e89b31o12e22df2be7f3...@mail.gmail.com>
Content-Type: text/plain; charset=UTF-8

On Wed, Mar 4, 2009 at 12:25 PM, Michael Easter <codeto...@gmail.com> wrote:
>
> Folks,
>
> I have a simple type called Beverage and an example that allows me to
> construct Maybe Beverage types.
>
> Here are some type signatures for example functions:
>
> request :: String -> Maybe Beverage
>
> addMalt :: Beverage -> Maybe Beverage
>
> I have defined a chain function like so:
>
> chain :: (Maybe a) -> (a -> Maybe b) -> (Maybe b)
> chain = (>>=)
>
> I can do this:
>
> (chain (request "beer") addMalt)
>
> and
>
> request "beer" `chain` addMalt
>
> I think I understand why, as I use the back-ticks for infix.
>
> However, I don't have to do that for the true bind function, (>>=)
>
> request "beer" >>= addMalt
>
> I would like to use chain in this way -- that is without back-ticks.  I'm
> not sure how...
>
> Is there something I'm missing?

Yes, there are certain function names that allow infix usage without
the back-ticks, the name 'chain' doesn't.  What those function names
are?  Roughly you can say that functions that they are functions that
look like binary operations, like + - ++ >>> etc.  I'm not sure I read
the pangauage spec correctly, but it looks like operators are made up
of the following characters !...@#$%^&*+-./\|<=>?~ (IIRC ':' has a
special meaning in that it's allowed in "constructors", cf 1:2:[]).

/M

-- 
Magnus Therning                        (OpenPGP: 0xAB4DFBA4)
magnus@therning.org          Jabber: magnus@therning.org
http://therning.org/magnus         identi.ca|twitter: magthe


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

Message: 5
Date: Wed, 4 Mar 2009 14:00:21 +0100
From: Daniel Fischer <daniel.is.fisc...@web.de>
Subject: Re: [Haskell-beginners] infix and bind pseudonym
To: Michael Easter <codeto...@gmail.com>, beginners@haskell.org
Message-ID: <200903041400.21553.daniel.is.fisc...@web.de>
Content-Type: text/plain;  charset="iso-8859-1"

Am Mittwoch, 4. März 2009 13:25 schrieb Michael Easter:
> Folks,
>
> I have a simple type called Beverage and an example that allows me to
> construct Maybe Beverage types.
>
> Here are some type signatures for example functions:
>
> request :: String -> Maybe Beverage
>
> addMalt :: Beverage -> Maybe Beverage
>
> I have defined a chain function like so:
>
> chain :: (Maybe a) -> (a -> Maybe b) -> (Maybe b)
> chain = (>>=)
>
> I can do this:
>
> (chain (request "beer") addMalt)
>
> and
>
> request "beer" `chain` addMalt
>
> I think I understand why, as I use the back-ticks for infix.
>
> However, I don't have to do that for the true bind function, (>>=)
>
> request "beer" >>= addMalt
>
> I would like to use chain in this way -- that is without back-ticks.  I'm
> not sure how...

You can't.
Haskell has (infix) operators, whose names are composed of symbols (>, <, |, 
:, +, ...) and (prefix) functions, whose names are composed of letters, 
underscores (_) and primes (').
If you want to use a function infix or an operator prefix, you must indicate 
that to the compiler, which is done by enclosing a function name in backticks 
or an operator symbol in parentheses.

If you could use a function name infix or prefix without indicating which you 
want, what would

id const even

be? Should it be id `const` even or (id const) even?

>
> Is there something I'm missing?
>
> thanks
> Mike
>
> ps. Thanks to everyone for the great discussion on IO (re: previous
> question)



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

Message: 6
Date: Wed, 4 Mar 2009 14:20:25 +0100
From: Daniel Fischer <daniel.is.fisc...@web.de>
Subject: Re: [Haskell-beginners] infix and bind pseudonym
To: Magnus Therning <mag...@therning.org>, Michael Easter
        <codeto...@gmail.com>
Cc: beginners@haskell.org
Message-ID: <200903041420.25784.daniel.is.fisc...@web.de>
Content-Type: text/plain;  charset="utf-8"

Am Mittwoch, 4. März 2009 13:59 schrieb Magnus Therning:
> Yes, there are certain function names that allow infix usage without
> the back-ticks, the name 'chain' doesn't.  What those function names
> are?  Roughly you can say that functions that they are functions that
> look like binary operations, like + - ++ >>> etc.  I'm not sure I read
> the pangauage spec correctly, but it looks like operators are made up
> of the following characters !...@#$%^&*+-./\|<=>?~ (IIRC ':' has a
> special meaning in that it's allowed in "constructors", cf 1:2:[]).

':' is the symbol-equivalent of an upper case letter, so it's special only if 
it's the first symbol of an operator name, then the operator is a 
constructor. It can appear in any place but the first in ordinary operators.
For example:
        (:) :: a -> [a] -> [a]  -- first symbol is ':' => constructor
        (:+) :: (RealFloat a) => a -> a -> Complex a    -- constructor
        (/:/) :: a -> b -> b    -- ':' not first symbol => ordinary operator

>
> /M



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

Message: 7
Date: Wed, 4 Mar 2009 14:34:47 +0100
From: Thomas Davie <tom.da...@gmail.com>
Subject: Re: [Haskell-beginners] basic threading
To: Michael Easter <codeto...@gmail.com>
Cc: beginners@haskell.org
Message-ID: <65c03102-651e-405a-bf75-637b1795c...@gmail.com>
Content-Type: text/plain; charset=WINDOWS-1252; format=flowed;
        delsp=yes


On 4 Mar 2009, at 13:33, Michael Easter wrote:

>
> hi again everyone,
>
> I am giving a tech talk soon, and aspire to show an example from  
> Chapter 28 of RWH on the STM monad.
>
> My example is just a watered down version of the "transfer wealth"  
> example in the book.  However it is
> single threaded.
>
> Q: is there an "easy" example of illustrating 2 threads that do  
> something (trivial is fine)? I believe that the book constructs a
> thread library/manager of sorts but I wonder if there is something  
> easier.
>
> Though I'm not sure how to square this with my example, for now I'd  
> love to see an example of starting up
> 2 threads that do something and block until a keystroke is entered  
> in the terminal.
>
> My apologies if this is too vague or too much "can you do my  
> homework?" !

Certainly, here's a nice one:

map _ [] = []
map f (x:xs) = f x : map f xs

parMap _ [] = []
parMap f (x:xs) = let fx = f x in fx `pseq` fx : map f xs

I realise this isn't what you expected – it's not the STM monad – but  
it *is* basic threading, far more basic, and far nicer than firing up  
monads and communication between threads.

Bob

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

Message: 8
Date: Wed, 04 Mar 2009 14:46:02 +0100
From: "Henk-Jan van Tuyl" <hjgt...@chello.nl>
Subject: Re: [Haskell-beginners] basic threading
To: "Michael Easter" <codeto...@gmail.com>, beginners@haskell.org
Message-ID: <op.up9si0yepz0...@zen5.router.home>
Content-Type: text/plain; format=flowed; delsp=yes;
        charset=iso-8859-15

On Wed, 04 Mar 2009 13:33:37 +0100, Michael Easter <codeto...@gmail.com>  
wrote:

> I am giving a tech talk soon, and aspire to show an example from Chapter  
> 28
> of RWH on the STM monad.
>
> My example is just a watered down version of the "transfer wealth"  
> example
> in the book.  However it is
> single threaded.
>
> Q: is there an "easy" example of illustrating 2 threads that do something
> (trivial is fine)? I believe that the book constructs a
> thread library/manager of sorts but I wonder if there is something  
> easier.
>
> Though I'm not sure how to square this with my example, for now I'd love  
> to
> see an example of starting up
> 2 threads that do something and block until a keystroke is entered in the
> terminal.
>


The page
   http://www.haskell.org/haskellwiki/Concurrency_demos
links to several examples of concurrency; maybe you are also interested in  
parallelism:
   
http://groups.google.com/group/fa.haskell/browse_thread/thread/2aa4252637b50e0a

Regards,
Henk-Jan van Tuyl


--
http://functor.bamikanarie.com
http://Van.Tuyl.eu/
--




-- 



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

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://www.haskell.org/mailman/listinfo/beginners


End of Beginners Digest, Vol 9, Issue 6
***************************************

Reply via email to