Re: [Haskell-cafe] Overriding a Prelude function?
Here's what I get: [michael@localhost ~]$ ghci GHCi, version 6.10.1: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer ... linking ... done. Loading package base ... linking ... done. Prelude> import Prelude hiding ((>>)) <interactive>:1:0: parse error on input `import' Prelude> ===== I was passing seed0 to rollDie and getting back (r1,seed1) passing seed1 to rollDie and getting back (r2,seed2) passing seed2 to rollDie and getting back (r3,seed3) Just based on the problem text, I would guess that passing rollDie and seed0 to (>>) I would get back (r3,seed3), losing the intermediate random numbers r1 and r2 along the way, at least that's what I understood it to say. So, I know that next I'm probably going to have to do something to remedy that, but I haven't gotten to that next step yet. What is unsugar? Thanks in advance for your patience. Michael --- On Wed, 4/22/09, Dan Weston <westondan@imageworks.com> wrote: From: Dan Weston <westondan@imageworks.com> Subject: Re: [Haskell-cafe] Overriding a Prelude function? To: "Ross Mellgren" <rmm-haskell@z.odi.ac> Cc: "michael rice" <nowgate@yahoo.com>, "haskell-cafe@haskell.org" <haskell-cafe@haskell.org> Date: Wednesday, April 22, 2009, 12:37 PM Be aware that the do unsugars to (Prelude.>>), not your (>>), even if you hide (Prelude.>>): import Prelude hiding ((>>)) m >> f = error "Call me!" main = putStrLn . show $ do [3,4] [5] The desugaring of the do { [3,4]; [5] } is (Prelude.>>) [3,4] [5] = [5,5], whereas you might have hoped for [3,4] >> [5] = error "Call me!" Dan Ross Mellgren wrote:
I think
import Prelude hiding ((>>))
does that.
-Ross
On Apr 22, 2009, at 11:44 AM, michael rice wrote:
I've been working through this example from: http://en.wikibooks.org/wiki/Haskell/Understanding_monads
I understand what they're doing all the way up to the definition of (>>), which duplicates Prelude function (>>). To continue following the example, I need to know how to override the Prelude (>>) with the (>>) definition in my file rand.hs.
Michael
==============
[michael@localhost ~]$ cat rand.hs import System.Random
type Seed = Int
randomNext :: Seed -> Seed randomNext rand = if newRand > 0 then newRand else newRand + 2147483647 where newRand = 16807 * lo - 2836 * hi (hi,lo) = rand `divMod` 127773
toDieRoll :: Seed -> Int toDieRoll seed = (seed `mod` 6) + 1
rollDie :: Seed -> (Int, Seed) rollDie seed = ((seed `mod` 6) + 1, randomNext seed)
sumTwoDice :: Seed -> (Int, Seed) sumTwoDice seed0 = let (die1, seed1) = rollDie seed0 (die2, seed2) = rollDie seed1 in (die1 + die2, seed2)
(>>) m n = \seed0 -> let (result1, seed1) = m seed0 (result2, seed2) = n seed1 in (result2, seed2)
[michael@localhost ~]$
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org <mailto:Haskell-Cafe@haskell.org> http://www.haskell.org/mailman/listinfo/haskell-cafe
On Wed, Apr 22, 2009 at 1:47 PM, michael rice <nowgate@yahoo.com> wrote:
Here's what I get:
[michael@localhost ~]$ ghci GHCi, version 6.10.1: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer ... linking ... done. Loading package base ... linking ... done. Prelude> import Prelude hiding ((>>))
You know, to avoid this nonsense you could just name the operator something else, like >>~, or ~>>, or $@**!. Operators are just names. Luke
<interactive>:1:0: parse error on input `import' Prelude>
=====
I was passing seed0 to rollDie and getting back (r1,seed1) passing seed1 to rollDie and getting back (r2,seed2) passing seed2 to rollDie and getting back (r3,seed3)
Just based on the problem text, I would guess that passing rollDie and seed0 to (>>) I would get back (r3,seed3), losing the intermediate random numbers r1 and r2 along the way, at least that's what I understood it to say.
So, I know that next I'm probably going to have to do something to remedy that, but I haven't gotten to that next step yet. What is unsugar?
Thanks in advance for your patience.
Michael
--- On *Wed, 4/22/09, Dan Weston <westondan@imageworks.com>* wrote:
From: Dan Weston <westondan@imageworks.com> Subject: Re: [Haskell-cafe] Overriding a Prelude function? To: "Ross Mellgren" <rmm-haskell@z.odi.ac> Cc: "michael rice" <nowgate@yahoo.com>, "haskell-cafe@haskell.org" < haskell-cafe@haskell.org> Date: Wednesday, April 22, 2009, 12:37 PM
Be aware that the do unsugars to (Prelude.>>), not your (>>), even if you hide (Prelude.>>):
import Prelude hiding ((>>)) m >> f = error "Call me!" main = putStrLn . show $ do [3,4] [5]
The desugaring of the do { [3,4]; [5] } is (Prelude.>>) [3,4] [5] = [5,5], whereas you might have hoped for [3,4] >> [5] = error "Call me!"
Dan
Ross Mellgren wrote:
I think
import Prelude hiding ((>>))
does that.
-Ross
On Apr 22, 2009, at 11:44 AM, michael rice wrote:
I've been working through this example from: http://en.wikibooks.org/wiki/Haskell/Understanding_monads
I understand what they're doing all the way up to the definition of (>>), which duplicates Prelude function (>>). To continue following the example, I need to know how to override the Prelude (>>) with the (>>) definition in my file rand.hs.
Michael
==============
[michael@localhost ~]$ cat rand.hs import System.Random
type Seed = Int
randomNext :: Seed -> Seed randomNext rand = if newRand > 0 then newRand else newRand + 2147483647 where newRand = 16807 * lo - 2836 * hi (hi,lo) = rand `divMod` 127773
toDieRoll :: Seed -> Int toDieRoll seed = (seed `mod` 6) + 1
rollDie :: Seed -> (Int, Seed) rollDie seed = ((seed `mod` 6) + 1, randomNext seed)
sumTwoDice :: Seed -> (Int, Seed) sumTwoDice seed0 = let (die1, seed1) = rollDie seed0 (die2, seed2) = rollDie seed1 in (die1 + die2, seed2)
(>>) m n = \seed0 -> let (result1, seed1) = m seed0 (result2, seed2) = n seed1 in (result2, seed2)
[michael@localhost ~]$
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org<http://mc/compose?to=Haskell-Cafe@haskell.org><mailto: Haskell-Cafe@haskell.org <http://mc/compose?to=Haskell-Cafe@haskell.org>> http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
michael rice wrote:
Here's what I get:
[michael@localhost ~]$ ghci GHCi, version 6.10.1: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer ... linking ... done. Loading package base ... linking ... done. Prelude> import Prelude hiding ((>>))
<interactive>:1:0: parse error on input `import' Prelude>
Not on the command line, you have to put import Prelude hiding ((>>), (>>=), return) into your rand.hs file. Regards, apfelmus -- http://apfelmus.nfshost.com
participants (3)
-
Heinrich Apfelmus -
Luke Palmer -
michael rice