[Haskell-cafe] Re: isWHNF :: a - IO Bool ?

2007-09-27 Thread apfelmus

Tristan Allwood wrote:

Does anyone know if there is a function that tells you if a haskell
value has been forced or not?

e.g. 
isWHNF :: a - IO Bool


let x = (map succ [0..]) in do
  putStrLn . show (isWHNF x)-- False
  putStrLn . show . head $ x
  putStrLn . show (isWHNF x)-- True
  putStrLn . show (isWHNF (Just undefined)) -- True


Note that this function is not referentially transparent since

  isWHNF 2 = True

but

  isWHNF (1+1) = False

although 1+1 = 2. In other words, it messes up the language semantics 
(extensional equality) which is bad.


Regards,
apfelmus

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Re: isWHNF :: a - IO Bool ?

2007-09-27 Thread Tristan Allwood
On Thu, Sep 27, 2007 at 05:31:51PM +0200, apfelmus wrote:
 Tristan Allwood wrote:
 Does anyone know if there is a function that tells you if a haskell
 value has been forced or not?  e.g. isWHNF :: a - IO Bool let x =
 (map succ [0..]) in do putStrLn . show (isWHNF x)--
 False putStrLn . show . head $ x putStrLn . show (isWHNF x)
 -- True putStrLn . show (isWHNF (Just undefined)) -- True

 Note that this function is not referentially transparent since

   isWHNF 2 = True

 but

   isWHNF (1+1) = False

 although 1+1 = 2. In other words, it messes up the language semantics
 (extensional equality) which is bad.
Indeed.  Does it still mess up with the result in IO Bool (as was my
intent)? 

Ah, I do realise my example use case above needs some ='s inserting
into it which may have led to some confusion.

Tris

-- 
Tristan Allwood
PhD Student
Department of Computing
Imperial College London
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] Re: isWHNF :: a - IO Bool ?

2007-09-27 Thread Jon Fairbairn
apfelmus [EMAIL PROTECTED] writes:

 Tristan Allwood wrote:
 Does anyone know if there is a function that tells you if a haskell
 value has been forced or not?

 e.g. isWHNF :: a - IO Bool

 let x = (map succ [0..]) in do
   putStrLn . show (isWHNF x)-- False
   putStrLn . show . head $ x
   putStrLn . show (isWHNF x)-- True
   putStrLn . show (isWHNF (Just undefined)) -- True

 Note that this function is not referentially transparent since

   isWHNF 2 = True

 but

   isWHNF (1+1) = False

 although 1+1 = 2. In other words, it messes up the language
 semantics (extensional equality) which is bad.

Isn't it OK if it's a - IO Bool ? (Admittedly, the test
example above is wrong in that case).

-- 
Jón Fairbairn [EMAIL PROTECTED]

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Re: isWHNF :: a - IO Bool ?

2007-09-27 Thread Jonathan Cast
On Thu, 2007-09-27 at 16:57 +0100, Tristan Allwood wrote:
 On Thu, Sep 27, 2007 at 05:31:51PM +0200, apfelmus wrote:
  Tristan Allwood wrote:
  Does anyone know if there is a function that tells you if a haskell
  value has been forced or not?  e.g. isWHNF :: a - IO Bool let x =
  (map succ [0..]) in do putStrLn . show (isWHNF x)--
  False putStrLn . show . head $ x putStrLn . show (isWHNF x)
  -- True putStrLn . show (isWHNF (Just undefined)) -- True
 
  Note that this function is not referentially transparent since
 
isWHNF 2 = True
 
  but
 
isWHNF (1+1) = False
 
  although 1+1 = 2. In other words, it messes up the language semantics
  (extensional equality) which is bad.
 Indeed.  Does it still mess up with the result in IO Bool (as was my
 intent)? 

In IO this should be fine, as IO is explicitly a non-determinism monad
(along with everything else).

jcc

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] Re: isWHNF :: a - IO Bool ?

2007-09-27 Thread apfelmus

Tristan Allwood wrote:

Does anyone know if there is a function that tells you if a haskell
value has been forced or not?  e.g. isWHNF :: a - IO Bool


apfelmus wrote:

Note that this function [isWHNF :: a - Bool] is not
referentially transparent


Indeed.  Does it still mess up with the result in IO Bool (as was my
intent)? 


It depends, but I think yes. I mean, given extensional equality,

  isWHNF 2
  isWHNF (1+1)

still have to be the same IO actions, in the sense that there cannot be 
a guarantee that the first always returns  True  during execution 
without the second returning always  True , too. That is, you may not 
depend on such a property for proving that your program is correct, 
although you may use it for performance (memory  time) characteristics 
(I don't know how you would use  isWHNF  to do /that/, but it's a 
hypothetical possibility). In other words, if your program output is 
correct with a fake nondeterministic replacement like


  isWHNF x = do
b' - getMemoizedValueFor x
if b' then return True else do
  b - randomIO
  when b $ setMemoizedValueFor x True
  return b

then it's safe, otherwise it's not. But similarly to a memoization 
function implemented with unsafePerformIO


  memoize :: Ord a = (a - b) - (a - b)

you may well use the not so nondeterministic property of  isWHNF  to 
achieve a time  space improvement.


Regards,
apfelmus

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe