Re: Record of STRefs better than STRef to a Record?

2002-12-27 Thread Eray Ozkural
On Thursday 14 November 2002 01:29 am, Jorge Adriano wrote:
 In some functions I might need only some pure fields, and none of the
 STRefs, but since I pass something of type 'E s' around, everything ends up
 beeing monadic. Is using two records (on with STRefs and one with pure
 fields) the only/best way to avoid this?
 I would like to use two records, doesn't seem natural, but I also don't
 like to end up using monadic functions when they are, in fact, pure...


Good question. In all Haskell codes I wrote, I ended up writing a lot of 
monadic functions which seemed to be unavoidable. Then you look at the code 
as it feels too much like an imperative code and start wondering why you are 
using a functional language :)

Happy new year to all Haskellers by the way.

Cheers,

-- 
Eray Ozkural [EMAIL PROTECTED]
Software Engineer, BICOM Inc.
GPG public key fingerprint: 360C 852F 88B0 A745 F31B  EA0F 7C07 AE16 874D 539C

___
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe



Implicit params [was Re: Record of STRefs better than STRef to a Record?]

2002-11-14 Thread Iavor S. Diatchki
hello,


Well, actually you must be right since the pure field defines a pure
(projection) function... Hmmm, ok, can someone explain this to me,

data E s = E{
  refi :: STRef s Int,
  refc :: STRef s Char,
  m:: Int
}

-- this is fine, obviously...
pure   :: E s - Int
pure e = m e

-- but this is not...
pure2 :: (?e :: E s) = Int
pure2 = m (?e)

Why exactly isn't this allowed? What is the workaround?
Error msg:

Ambiguous constraint `?e :: E s'
At least one of the forall'd type variables mentioned by the
constraint
must be reachable from the type after the '='
In the type: forall s. (?e :: E s) = Int
While checking the type signature for `pure2'
Failed, modules loaded: none.
--



this seems like a bug in GHC.   Hugs is happy with it.  The s in the 
pure2 signature is not ambiguous because it is determined when you give 
the value of the implicit parameter.  in fact the way i think about 
implicit parameters is simply as a nice notation for computations in the 
environment monad, so in my mind the above two definitions are pretty 
much the same.

bye
iavor

--
==
| Iavor S. Diatchki, Ph.D. student   |
| Department of Computer Science and Engineering |
| School of OGI at OHSU  |
| http://www.cse.ogi.edu/~diatchki   |
==

___
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe


RE: Record of STRefs better than STRef to a Record?

2002-11-13 Thread Simon Marlow

 If I use an STRef to a record, will a new record be created 
 each time I want 
 to update a single field? Or can I expect GHC to optimize it 
 and have the field of the record updated in place?

You'll get a new record for each update.  This might not be so bad
though, depending on the number of fields in your record.

 Right now I'm using a record of STRefs, like:
 data E s = E{
   refi ::  STRef s Int,
   refc ::  STRef s Char
 }
 
 but it can get a little messy, since thread s propagates to 
 every datatype that uses the record type in it's definition.

Here's another trick if you use this route:

 data E s = E{
   refi ::  !STRef s Int,
   refc ::  !STRef s Char
 }

and compile with -funbox-strict-fields.  This will eliminate the boxing
of the STRefs.

Cheers,
Simon
___
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe



Re: Record of STRefs better than STRef to a Record?

2002-11-13 Thread Jorge Adriano

  If I use an STRef to a record, will a new record be created
  each time I want
  to update a single field? Or can I expect GHC to optimize it
  and have the field of the record updated in place?

 You'll get a new record for each update.  This might not be so bad
 though, depending on the number of fields in your record.
One of them has 4, the other 3, but they might grow bigger...


 Here's another trick if you use this route:
added some parenthesis
  data E s = E{
refi ::  !(STRef s Int),
refc ::  !(STRef s Char)
  }

 and compile with -funbox-strict-fields.  This will eliminate the boxing
 of the STRefs.

Nice, thanks :)


One more question. 
I'm passing that 'record' around as an implicit value. The record as STRefs 
that I use to collect info, but it also has some pure fields with 'read-only' 
info. Something like,

data E s = E{
  refi :: STRef s Int,
  refc :: STRef s Char,
  max  :: Int
}

In some functions I might need only some pure fields, and none of the STRefs, 
but since I pass something of type 'E s' around, everything ends up beeing 
monadic. Is using two records (on with STRefs and one with pure fields) the 
only/best way to avoid this? 
I would like to use two records, doesn't seem natural, but I also don't like 
to end up using monadic functions when they are, in fact, pure...

Thanks,
J.A.




___
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe