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: clarification on IO (Will Ness)
   2.  Re: Finite State Machine .. (Heinrich Apfelmus)
   3. Re:  Re: clarification on IO (Gregg Reynolds)
   4.  Re: clarification on IO (Will Ness)
   5.  Re: clarification on IO (Will Ness)
   6. Re:  Re: Finite State Machine .. (Tom Poliquin)
   7.  let indenting problems (7stud)
   8. Re:  let indenting problems (Miguel Pignatelli)


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

Message: 1
Date: Sun, 1 Mar 2009 10:28:24 +0000 (UTC)
From: Will Ness <will_...@yahoo.com>
Subject: [Haskell-beginners] Re: clarification on IO
To: beginners@haskell.org
Message-ID: <loom.20090301t094531-...@post.gmane.org>
Content-Type: text/plain; charset=utf-8

Michael Easter <codetojoy <at> gmail.com> writes:

> 
> 
> Thanks Andrew, this is really great...My main revelation here is that a "side-
effect" in other monads is still pure.  e.g. The Logger example in RWH builds 
up a list of log strings "behind the scenes" but this is much different than 
writing to disk, or launching missiles, to quote SP Jones.


May be this is exactly how we ought to look at the IO monad - as a Logger 
monad? Each IO-bound chain of action-functions defining an IO value that holds 
a record of what it is the IO primitives that we used promised us they will do 
when run by the system.

That's it.

(?)

After all, we can have a definition of such a value, and have it run multiple 
times for us, so _as definition_ it's no different than any other definition in 
Haskell. It's just that _its value_ can cause the system to actually perform 
these IO actions in some circumstances. 

As for terminology: we've got to have some special name for functions that are 
chainable by bind. Calling them actions confuses them with the real world 
actions performed by IO.

May be to call them "action functions"?




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

Message: 2
Date: Sun, 01 Mar 2009 11:31:45 +0100
From: Heinrich Apfelmus <apfel...@quantentunnel.de>
Subject: [Haskell-beginners] Re: Finite State Machine ..
To: beginners@haskell.org
Message-ID: <godo4k$jo...@ger.gmane.org>
Content-Type: text/plain; charset=ISO-8859-1

Tom Poliquin wrote:
> 
> 1) Is there a nice (canonical) way of eliminating
>   nested evil in Haskell?  I thought that perhaps making
>   a tuple of all the if's conditions and patterm matching
>   on them might make a bit more comprehensible.
>   Likely there's a better way.

You probably want guards, like this

  fib n
     | n == 0    = 0
     | n == 1    = 1
     | otherwise = fib (n-1) + fib (n-2)



Regards,
apfelmus

--
http://apfelmus.nfshost.com



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

Message: 3
Date: Sun, 1 Mar 2009 08:57:04 -0600
From: Gregg Reynolds <d...@mobileink.com>
Subject: Re: [Haskell-beginners] Re: clarification on IO
To: Will Ness <will_...@yahoo.com>
Cc: beginners@haskell.org
Message-ID:
        <75cc17ac0903010657k36e1075dw98db4fedb10e3...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

On Sun, Mar 1, 2009 at 4:28 AM, Will Ness <will_...@yahoo.com> wrote:

> Michael Easter <codetojoy <at> gmail.com> writes:
> ...
> After all, we can have a definition of such a value, and have it run
> multiple
> times for us, so _as definition_ it's no different than any other
> definition in
> Haskell. It's just that _its value_ can cause the system to actually
> perform
> these IO actions in some circumstances.


But it isn't a definition.  "Reference" would be better; "getChar" is a term
that references a value.

>
> As for terminology: we've got to have some special name for functions that
> are
> chainable by bind. Calling them actions confuses them with the real world
> actions performed by IO.
>

Correction:  special name for IO "functions" (actually "IO terms" would be
better).  The monad just organizes stuff, so the IO monad, as monad, is no
different than any other monad.

>
> May be to call them "action functions"?
>

This was a big problem for me; I find terms like "action", "computation",
"function" completely misleading for IO terms/values.  You might find
"Computation"
considered harmful. "Value" not so hot
either<http://syntax.wikidot.com/blog:5>useful; see also the comment
"Another try at the key sentence".  There are a
few other articles on the blog that address this terminology problem.

-gregg
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
http://www.haskell.org/pipermail/beginners/attachments/20090301/e0ccb0b8/attachment-0001.htm

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

Message: 4
Date: Sun, 1 Mar 2009 17:59:38 +0000 (UTC)
From: Will Ness <will_...@yahoo.com>
Subject: [Haskell-beginners] Re: clarification on IO
To: beginners@haskell.org
Message-ID: <loom.20090301t162531-...@post.gmane.org>
Content-Type: text/plain; charset=utf-8

Gregg Reynolds <dev <at> mobileink.com> writes:

> On Sun, Mar 1, 2009 at 4:28 AM, Will Ness <will_n48 <at> yahoo.com> wrote:
> 
> 
> Michael Easter <codetojoy <at> gmail.com> writes:
> ...
> After all, we can have a definition of such a value, and have it run multiple
> times for us, so _as definition_ it's no different than any other definition 
in
> Haskell. It's just that _its value_ can cause the system to actually perform
> these IO actions in some circumstances.
> 
> But it isn't a definition.  "Reference" would be better; "getChar" is a term 
that references a value. 


Excuse me for being too brief. I was talking about the definitions of IO 
values, of type (IO a), viz. the do-block (or bind-chain) definitions, as in

  let v=do { getChar; putStrLn "12"; return 2 }

that are just regular Haskell defintions, from inside the Haskell world POV. 
The IO-action functions involved here would be 

  getChar
  (\_-> putStrLn "12")
  (\_-> return 2)

These IO-action functions, chaind by IO bind, create a combined-actions IO 
value, in this case of type (:: Num a => IO a).

The IO-action is not the I/O operation in the real world, but an action of 
recording a promise to perform it. 

Any IO primitive can be seen as latching this hidden promise onto its explicit 
return value, thus creating a monadic value (:: IO a), carrying along this 
hidden promise. IO bind combines these promises into a combined record, or log, 
of promises to perform actual I/O activity, if called upon by the system. 

That recording of a promise is the IO-action that IO monad is about, from pure 
Haskell standpoint. 

Another monad will have another meaning for its actions, latching another 
hidden data on their results, but they still can be seen as actions, in context 
of being sequenced and combined by that monad's bind. 

Haskell will also attempt to reduce and simplify this combined actions value, 
unlike in IO case where it can't do that because the values involved can change 
from one invocation to another.

So seen from inside the pure Haskell world IO monad is just another Logging 
Monad, building logs of future activity to be performed. And it can be 
performed more than once, of course:

  Prelude> let v=do{ getChar; putStrLn "12"; return () }
  Prelude> [v] 
  [<<IO action>>] :: [IO ()]  
  Prelude> v
  c12
  Prelude> v
  d12
  Prelude> 

> As for terminology: we've got to have some special name for functions that are
> chainable by bind. Calling them actions confuses them with the real world
> actions performed by IO.


What I seek here is to demystify the monad, any monad, and IO monad in 
particular, and for that a clear and consisent terminology must be employed. We 
should be able to name things, in English, that we talk about - in English.


> Correction:  special name for IO "functions" (actually "IO terms" would be 
better).  


Why? They are just fuctions, of type (Monad m => a -> m b). What I'm saying, 
they are of special type, chainable by the M monad, so it seems logical to have 
a special name for such M-chainable functions, e.g. "M-action functions" 
(whatever the M). 

The monad M is chaining and combining something. It is M-action functions, of 
type (a -> M b), that get chained by its bind, and their hidden data combined 
by it, behind the curtain. 

Usually when we have a name for some concept, it becomes clearer. And vice 
versa.


> The monad just organizes stuff, so the IO monad, as monad, is no different 
than any other monad. 
> 
> 
> 
> May be to call them "action functions"?
> 
> 
> This was a big problem for me; I find terms 
like "action", "computation", "function" completely misleading for IO 
terms/values.  


Why? A function of type (a -> M b) is a function that returns a value, (:: M 
b), tagged with some monadic hidden data. In case of IO, it is a promise to 
perform some actual I/O that's passed around, hidden. But the M-action function 
itself is just a regular Haskell function. It can be defined elsewhere, 
anywhere. 

IO values themselves are no mystery too. They just carry along with them a log 
of promised I/O activity as specified at time of their creation (definition).


> You might find ["Computation" considered harmful. "Value" not so hot either] 
useful; see also the comment "Another try at the key sentence".  There are a 
few other articles on the blog that address this terminology problem.


Thank you. Will do.






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

Message: 5
Date: Mon, 2 Mar 2009 02:28:18 +0000 (UTC)
From: Will Ness <will_...@yahoo.com>
Subject: [Haskell-beginners] Re: clarification on IO
To: beginners@haskell.org
Message-ID: <loom.20090301t162531-...@post.gmane.org>
Content-Type: text/plain; charset=utf-8

Gregg Reynolds <dev <at> mobileink.com> writes:

> 
> 
>> On Sun, Mar 1, 2009 at 4:28 AM, Will Ness <will_n48 <at> yahoo.com> wrote:
>> 
>> 
>> Michael Easter <codetojoy <at> gmail.com> writes:
>> ...
>> It's just that _its value_ can cause the system to actually perform
>> these IO actions in some circumstances.
>> 
>> 
>> May be to call them "action functions"?
> 
> 
> This was a big problem for me; I find terms 
like "action", "computation", "function" completely misleading for IO 
terms/values.  You might find ["Computation" considered harmful. "Value" not so 
hot either] useful; see also the comment "Another try at the key sentence".  
There are a few other articles on the blog that address this terminology 
problem.


Have read it now. Didn't like the formulation in that comment though. It's 
mixing together issues of monad in general and IO in particular when it speaks 
of "side-effects" being attached "to a value". 

No value has side-effects in Haskell. There are no side effects in Haskell.

There are no values in Haskell either, only expressions denoting values. (1+
(1+1)) , (1+2), 3 - it's all the same, and nothing precludes Haskell 
implementation from actually exchanging one with another right away. 

Here's one possible sketch-out of IO monad to clarify what I mean:

data IO a = IORec -> (a,IORec) -- record of I/O activities to be performed

instance Monad IO where
  return a rec = (a,rec)              -- return :: a -> IO a
  (m »= g) rec = uncurry g $ m rec    -- g      :: a -> IO b

putStrLn :: a -> IO ()
putStrLn a rec = ((),rec ++ [("putStrLn", a)]) 


Thus it is all just pure Haskell, building a record of I/O requests that can 
get executed "on the outside" by the run-time system. Being defined once, it 
can be run several times, or none at all.

This is exactly like your idea on that log you mentioned about separating the 
pure Haskell world and the "outer" impure world of I/O - or IOW, pure 
compiler's world and run-time system.




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

Message: 6
Date: Sun, 1 Mar 2009 22:28:27 -0800
From: Tom Poliquin <poliq...@softcomp.com>
Subject: Re: [Haskell-beginners] Re: Finite State Machine ..
To: beginners@haskell.org
Message-ID: <200903012228.27322.poliq...@softcomp.com>
Content-Type: text/plain;  charset="iso-8859-1"

> > I'm working on a project (in Haskell) and was
> > given some old Java code to indicate the required
> > functionality for a particular function. It's a page of
> > nested (4 deep) if statements. (That's probably
> > why they gave me the code, no one could
> > describe it).

> > 1) Is there a nice (canonical) way of eliminating
> >  nested evil in Haskell? 

> >2) If an FSM is appropriate is there a 'standard'
> >  Haskell  FSM implementation?

> > It actually seems like a fun problem  .. if I
> > had the time ..

Andrew Wagner wrote:

> This does sound interesting. Can you provide (at least some of) the code?

As I thought it would violate the group mores I didn't include the Java
code here .. :-)    It's at
http://www.softcomp.com/pastes/ifexample.java
This is a typical module .. others are worse.


 Heinrich Apfelmus wrote:

> You probably want guards, like this

>  fib n
>     | n == 0    = 0
 >    | n == 1    = 1
  >   | otherwise = fib (n-1) + fib (n-2)

Is this what you had in mind?

module Main where

foo a b c
     | p1 && p2 || not p3 = 42
     | p1 || not p2 && p3 = 13
     | otherwise = 0
  where
   -- setup if predicates
       p1 = a > b
       p2 = a + b > 2
       p3 = a - b < 1

main = do
        x <- return $ foo 9 2 3
        print x

--   42

Thanks,

Tom




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

Message: 7
Date: Mon, 2 Mar 2009 08:51:39 +0000 (UTC)
From: 7stud <bbxx789_0...@yahoo.com>
Subject: [Haskell-beginners] let indenting problems
To: beginners@haskell.org
Message-ID: <loom.20090302t084813-...@post.gmane.org>
Content-Type: text/plain; charset=us-ascii

I get indenting errors with the following attempts to use let:

-----
import Data.List (sortBy)

mySort xs = sortBy myCompare xs
    let lx = length x
        ly = length y
    in where myCompare x y 
              | lx < ly    = LT    
              | lx == ly   = EQ
              | lx > ly    = GT  

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

import Data.List (sortBy)

mySort xs = sortBy myCompare xs
    where myCompare x y    
        let lx = length x
            ly = length y
        in

        | lx < ly    = LT
        | lx == ly   = EQ
        | lx > ly    = GT  

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

import Data.List (sortBy)

mySort xs = sortBy myCompare xs
    where myCompare x y    
        let lx = length x
            ly = length y
        in  | lx < ly    = LT
            | lx == ly   = EQ
            | lx > ly    = GT 

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


This is what I ended up with:

-------
import Data.List (sortBy)

mySort xs = sortBy myCompare xs
    where myCompare x y  
              | lx < ly    = LT
              | lx == ly   = EQ
              | lx > ly    = GT            
             where lx = length x
                   ly = length y
-------

But I would like to know how to use let.







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

Message: 8
Date: Mon, 02 Mar 2009 10:46:23 +0100
From: Miguel Pignatelli <miguel.pignate...@uv.es>
Subject: Re: [Haskell-beginners] let indenting problems
To: 7stud <bbxx789_0...@yahoo.com>
Cc: beginners@haskell.org
Message-ID: <49abaaef.2030...@uv.es>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed

What about...

mySort xs = let myCompare x y   
                 | lx < ly = LT
                 | lx == ly = EQ
                 | lx > ly = GT
                   where
                    lx = length x
                    ly = length y
                in sortBy myCompare xs


M;


7stud wrote:
> I get indenting errors with the following attempts to use let:
> 
> -----
> import Data.List (sortBy)
> 
> mySort xs = sortBy myCompare xs
>     let lx = length x
>         ly = length y
>     in where myCompare x y 
>               | lx < ly    = LT    
>               | lx == ly   = EQ
>               | lx > ly    = GT  
> 
> ------------------
> 
> import Data.List (sortBy)
> 
> mySort xs = sortBy myCompare xs
>     where myCompare x y    
>         let lx = length x
>             ly = length y
>         in
> 
>         | lx < ly    = LT
>         | lx == ly   = EQ
>         | lx > ly    = GT  
> 
> -------------
> 
> import Data.List (sortBy)
> 
> mySort xs = sortBy myCompare xs
>     where myCompare x y    
>         let lx = length x
>             ly = length y
>         in  | lx < ly    = LT
>             | lx == ly   = EQ
>             | lx > ly    = GT 
> 
> -------------
> 
> 
> This is what I ended up with:
> 
> -------
> import Data.List (sortBy)
> 
> mySort xs = sortBy myCompare xs
>     where myCompare x y  
>               | lx < ly    = LT
>               | lx == ly   = EQ
>               | lx > ly    = GT            
>              where lx = length x
>                    ly = length y
> -------
> 
> But I would like to know how to use let.
> 
> 
> 
> 
> 
> _______________________________________________
> Beginners mailing list
> Beginners@haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
> 


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

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


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

Reply via email to