[Haskell-cafe] How to check object's identity?
Derek Elkins
derek.a.elkins at gmail.com
Sun Jan 4 03:48:31 EST 2009
On Sun, 2009-01-04 at 16:19 +0800, Evan Laforge wrote:
> > Although equal? treats the two as the *same*, they're different lists
> > because if we modify one (e.g by set-car!) the other won't be affected.
> >
> > So here comes another question: when we say a function always give the
> > same output for the same input, what the *same* means here? ídentity
> > or equality?
>
> If you don't have set-car!, then identity and equality are impossible
> to differentiate. And haskell doesn't have set-car!.
>
> However, as was noted, it does have something like mutable pointers
> via IORef, and sure enough, you can do pointer comparisons with them:
>
> h <- newIORef 12
> h' <- newIORef 12
> print $ h == h --> True
> print $ h == h' --> False
>
> Since they're pointers, to compare by value you have to explicitly
> derefence them:
>
> print =<< liftM2 (==) (readIORef h) (readIORef h') --> True
>
>
> If you're wondering about the implementation of "(1:[], 1:[])", ghc
> might be smart enough to do CSE in this case and hence use the same
> memory for both lists, but in general CSE doesn't happen to avoid
> accidental recomputation. There's some stuff in the ghc manual about
> lambda and let lifting that describes when CSE will and won't happen.
> I wouldn't count on it in general, but I don't read core well enough
> to tell. Maybe someone who knows more about core can help me here:
>
> a =
> \ (eta_azv :: State# RealWorld) ->
> case a24 stdout lvl7 eta_azv
> of wild_aFu { (# new_s_aFw, a103_aFx #) ->
> $wa13 stdout '\n' new_s_aFw
> }
>
> There are lots of apparently undefined variables, like the function
> 'a24'. But it looks like the pair should come from 'lvl7', which is
> chained all the way down to 'lvl' like so:
>
> lvl :: Integer
> lvl = S# 1
>
> lvl1 :: [Integer]
> lvl1 =
> : @ Integer lvl ([] @ Integer)
>
> lvl2 :: ShowS
> lvl2 = showList lvl1
>
> lvl3 :: [ShowS]
> lvl3 = : @ ShowS lvl2 ([] @ ShowS)
>
> lvl4 :: [ShowS]
> lvl4 = : @ ShowS lvl2 lvl3
>
> lvl5 :: [Char]
> lvl5 = : @ Char a2 ([] @ Char)
>
> lvl6 :: String
> lvl6 =
> foldr1
> @ (String -> String) lvl16 lvl4 lvl5
>
> lvl7 :: [Char]
> lvl7 = : @ Char a lvl6
>
> So it *looks* like there's only one list created in 'lvl1', but I
> can't see where it's turning into a tuple, and I don't understand the
> ' = : ' stuff,
You're reading it wrong. : is a name.
It's lvl5 = (:) @ Char a2 ([] @ Char) where @ is type application
(instantiation). Triming that, it's
lvl5 = (:) a2 [] or just lvl5 = a2:[]
More information about the Haskell-Cafe
mailing list