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:  Recursion in monad (Adrian May)
   2.  small expression evaluator (Petr Novotnik)
   3. Re:  small expression evaluator (Henk-Jan van Tuyl)


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

Message: 1
Date: Tue, 22 Mar 2011 12:46:54 +0800
From: Adrian May <adrian.alexander....@gmail.com>
Subject: Re: [Haskell-beginners] Recursion in monad
To: beginners@haskell.org
Message-ID:
        <AANLkTi=fewz-u-ugxnqpu29bxghiayn6yxhow5ch4...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

OK I did this:

import System.Random

walk :: Int -> IO Int
walk i = randomRIO (0,1) >>= \r -> return (i+r*2-1)

say :: Int -> IO ()
say i = putStrLn $ show i

rep :: Int -> a -> (a -> IO a) -> (a -> IO ()) -> IO ()
rep n i w s
      | n<=0 = return ()
      | otherwise = s i >> w i >>= \ii -> rep (n-1) ii w s

main :: IO ()
main = rep 10 50 walk say

Is that the easiest way?

Adrian.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://www.haskell.org/pipermail/beginners/attachments/20110322/72654dd7/attachment-0001.htm>

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

Message: 2
Date: Tue, 22 Mar 2011 08:56:45 +0100
From: Petr Novotnik <pnovot...@googlemail.com>
Subject: [Haskell-beginners] small expression evaluator
To: Haskell Beginners List <beginners@haskell.org>
Message-ID: <4d88563d.2010...@googlemail.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed

Hello,

on my journey through Haskell I've hit a problem where I don't know any 
further and would greatly appreciate your help.

I've got this code so far:


data Value a e = VConst a
                | VFunc (e -> a)

evalV :: Value a e -> e -> a
evalV (VConst x) = const x
evalV (VFunc f) = f

liftV :: (a -> a -> t) -> (Value a e) -> (Value a e) -> e -> t
liftV f x y e = (evalV x e) `f` (evalV y e)

(.==.), (./=.) :: (Eq a) => (Value a e) -> (Value a e) -> e -> Bool
(.==.) = liftV (==)
(./=.) = liftV (/=)

(.&&.), (.||.) .... some more operators


This allows me to write client code like this:


data Person = Person {
       personName :: String
     , personAge :: Int
     }
     deriving (Show)

exampleExpr :: Bool
exampleExpr = (VConst 99) .==. (VFunc personAge) $ Person "pete" 99


I was wondering, whether it'd be possible to enable defining expression 
without the Value data constructors, i.e.


    99 .==. personAge $ Person "pete" 99


I've tried using a type class to have a function for lifting different 
types into Values.


class ToValue a e | a -> e where
   valueLift :: a -> Value a e


then I tried defining an instance for functions:

instance ToValue ((->) Person a) Person where
   valueLift f = undefined

in ghci:

 > :t valueLift personName
valueLift personName :: Value (Person -> String) Person

and suddenly I realized this will not work because I would need the type 
`Value String Person'.

Now, I'm stuck and don't know which path to take in order to come closer 
to being able writing "99 .==. personAge" or "personAge .==. 99". Maybe 
I'm approaching it in a completely wrong way or it's simply not 
possible. Do you have any ideas, hints?

Many thanks in advance for any kind of feedback,
pete.



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

Message: 3
Date: Tue, 22 Mar 2011 10:14:57 +0100
From: "Henk-Jan van Tuyl" <hjgt...@chello.nl>
Subject: Re: [Haskell-beginners] small expression evaluator
To: "Haskell Beginners List" <beginners@haskell.org>, "Petr Novotnik"
        <pnovot...@googlemail.com>
Message-ID: <op.vsqmm7wjpz0...@zen5.arnhem.chello.nl>
Content-Type: text/plain; charset=iso-8859-15; format=flowed;
        delsp=yes

On Tue, 22 Mar 2011 08:56:45 +0100, Petr Novotnik  
<pnovot...@googlemail.com> wrote:

> data Person = Person {
>        personName :: String
>      , personAge :: Int
>      }
>      deriving (Show)
>
> exampleExpr :: Bool
> exampleExpr = (VConst 99) .==. (VFunc personAge) $ Person "pete" 99
>
>
> I was wondering, whether it'd be possible to enable defining expression  
> without the Value data constructors, i.e.
>
>
>     99 .==. personAge $ Person "pete" 99

You can write:
   99 == personAge (Person "pete" 99)

Regards,
Henk-Jan van Tuyl


-- 
http://Van.Tuyl.eu/
http://members.chello.nl/hjgtuyl/tourdemonad.html
--



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

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


End of Beginners Digest, Vol 33, Issue 30
*****************************************

Reply via email to