那麼,你可以像這樣做:
{-# LANGUAGE MagicHash #-}
import GHC.Prim
import Unsafe.Coerce
此功能是從ehird的回答here:
equal :: a -> a -> Bool
equal x y = x `seq` y `seq`
case reallyUnsafePtrEquality# x y of
1# -> True
_ -> False
現在,讓我們進入正題。請注意,您需要強制參數和返回值,因爲這些函數實際上沒有可能的類型,正如ehird指出的那樣。
a,b,c :: x -> y
a x | unsafeCoerce x `equal` a = unsafeCoerce a
| unsafeCoerce x `equal` b = unsafeCoerce c
| unsafeCoerce x `equal` c = unsafeCoerce a
b x | unsafeCoerce x `equal` a = unsafeCoerce a
| unsafeCoerce x `equal` b = unsafeCoerce a
| unsafeCoerce x `equal` c = unsafeCoerce c
c x | unsafeCoerce x `equal` a = unsafeCoerce c
| unsafeCoerce x `equal` b = unsafeCoerce b
| unsafeCoerce x `equal` c = unsafeCoerce c
最後,一些測試:
test = a (c b) `equal` c -- Evaluates to True
test' = a (c b) `equal` a -- Evaluates to False
EHH ...
您必須使用一些數據標記該功能,以便您可以比較它們。也就是說,你不能使用普通函數。你需要把它們放在一個數據類型中,它也有一些可比的價值。 – 2012-03-16 22:58:02
到目前爲止你做了什麼?你有沒有這些功能的簽名? – 2012-03-16 22:59:37
你想通過實現這個來做什麼? – 2012-03-16 23:03:30