Haskell function to check if two values are identical -


in haskell have function (==) :: eq => a->a->bool fine large number of datatypes instance of eq can defined. there types there no reasonable way define instance of eq. 1 example simple function type (a->b)

i looking function tell me if 2 values same -- not equal identical.

for example f(id,id) ==> true f((+),(-)) = false

clarification:

i don't want know if 2 function same thing. not possible in general case so. want know if i've gotten same thing started with. let me give stripped down example:

data foo = foo (foo->foo)  --contains function no eq instance  x :: foo x = foo id -- or matter foo undefined  y :: foo y = foo (const x)  :: foo = let (foo fy) = y      in fy x 

it clear inspection once evaluated, a x. let's assume don't know function in y want test if foo put in same 1 got - fy x give me x. how do this?

one way wasn't mentioned in pointer equality in haskell? reallyunsafeptrequality#. name suggests can unpredictable , should't used can interesting see how ghc works. here's how can use in ghci:

> :set -package ghc-prim > import ghc.prim > import ghc.types > istrue# (reallyunsafeptrequality# id id) true > let x = x + 2 :: int > istrue# (reallyunsafeptrequality# a) true > let b x = x + 2 :: int > istrue# (reallyunsafeptrequality# b) false 

if function isn't monomorphic doesn't work:

> let c x = x + 2 > istrue# (reallyunsafeptrequality# c c) false 

some more examples:

> let d = c in istrue# (reallyunsafeptrequality# d d) false > :set -xmonomorphismrestriction > let d = c in istrue# (reallyunsafeptrequality# d d) true 

you can compare polymorphic types if wrap them in newtype:

> :set -xrankntypes > newtype x = x (forall a. num => -> a) > let d = x c > istrue# (reallyunsafeptrequality# d d) true 

applying makes them not equal

> istrue# (reallyunsafeptrequality# (id ()) (id ())) false 

but when compiling optimisations true.

hopefully enough convince want bad idea. 1 of solutions in pointer equality in haskell? better.


Comments

Popular posts from this blog

android - MPAndroidChart - How to add Annotations or images to the chart -

javascript - Add class to another page attribute using URL id - Jquery -

firefox - Where is 'webgl.osmesalib' parameter? -