2009-11-11 35 views
9

Haskell'de herhangi bir kalite göstergesi var mı? == Denklemi türetmek için şeyler gerektirir ve ben (Değer -> IO Değeri) içeren bir şey var ve ne - ne de IO türetmek Eq.Haskell'de işaretçi eşitliği?

DÜZENLEME: 'un işaretçi eşitliğine sahip olduğu başka bir dil için bir yorumlayıcı oluşturuyorum, bu nedenle bu davranışı modellemeye çalışırken, Haskell işlevlerini kapaklarını modellemek için kullanabiliyorum.

DÜZENLEME: Örnek:

> let x a = a * 2 
> let y = x 
> special x y 
True 
> let z a = a * 2 
> special x z 
False 

cevap

10

EDIT: Örneğinizi verdiğinizde, bunu IO monad ile modelleyebilirsiniz. Sadece işlevlerinizi IORef'lere atayın ve bunları karşılaştırın.

Prelude Data.IORef> z <- newIORef (\x -> x) 
Prelude Data.IORef> y <- newIORef (\x -> x) 
Prelude Data.IORef> z == z 
True 
Prelude Data.IORef> z == y 
False 
+0

Sadece iki fonksiyonun aynı işlevde olup olmadığını görmek istiyorum. İşaretçi eşitliği olan başka bir dil için bir tercüman oluşturmaya çalışıyorum ve bu davranışı taklit etmek istiyorum. – Claudiu

+2

Fakat "aynı işlev" tam olarak ne anlama geliyor? (\ x -> x) (\ x -> x) ile aynı işleve sahiptir. Aynı işlev ((\ x y -> y) x), vb. Gibi. İhtiyacınız olan şey, yorumladığınız dilde bir işlevin "adresini" izlemek için ek bir referans noktasıdır. Bir a -> (Int, a) kobrajuru modelleyen bir monad sırayla olabilir. – Apocalisp

+1

Maalesef kötülük = ID {unId = const undefined} davasına sahibiz, yani örneğiniz% 100 doğru değil. Bu sinir bozucu dipler. :) – Tirpen

3

IORefs Denk türetmek: Bunu yapacağını bir işlev special istiyorum. İşaretçinin eşitliğini elde etmek için başka ne ihtiyacın olduğunu anlamıyorum.

Düzeltme: İşaretçi eşitliğini karşılaştırmak için anlamlı olan tek şey, değiştirilebilen yapılardır. Ancak yukarıda belirttiğim gibi, iki IORef'in aynı yapıya sahip olup olmadığını görmenize izin veren IORefs, zaten örnek Eq gibi değişebilir yapılar, tam olarak işaretçi eşitliği.

+0

Üzgünüm, sorumu çözdüm. IO, Denklemi türetmez ve işlevleri de yoktur. İki fonksiyonun aynı işlevde olup olmadığını test etmek istiyorum. – Claudiu

+0

Ama IO'lar "işaretçiler" değil. Onları karşılaştırmak için ne anlama geldiğini göremiyorum. Bir örnek verebilir misin? – newacct

+0

Aynı işlevlerin olup olmadığını görmek için iki işlevi karşılaştıramazsınız. Mesela "foo x = 2 * x" ve "bar x = x + x" yazabilirim. Açıkça foo ve bar eşittir çünkü tüm x, foo x == bar x için, ancak genel durumda bu kararsızdır. Bunun istediğin gibi olmadığını biliyorum. karşılaştırma "farklı fonksiyonlar olabilir". Ama hayır, Haskell buna sahip değil. –

8

İşaretçi eşitliği referential transparency'u keser, yani NO.

belki de şaşırtıcı bir şekilde, gerçekte possiblecompact spaces toplam fonksiyonların extensional equality hesaplamak için, ama genel olarak (mümkün olmayan sonlandırmalı tamsayılar örneğin fonksiyonları), bu imkansızdır.


DÜZENLEME: Ben az önce onları çevirdikten Haskell fonksiyonları yanında özgün bir program AST veya kaynak konumunu tutabilir başka bir dilde

için bir tercüman oluşturuyorum? Buna göre "eşitlik" istediğin anlaşılıyor.

+3

Ben ifadeler 'genişlemeli eşitlik 've' kompakt topoloji 'ortak jargon içinde olmadığından eminim. – yfeldblum

+1

ifadeleri 'genişlemeli eşitlik 've' kompakt topoloji 'beni tutmayı engelleyen ifadelerdir. –

+0

İlginç bağlantı. İlk düşüncem "bu adam çöplükten konuşuyor". Ama genel işlevlerden bahsetmiyoruz, _computable_ işlevleri hakkında konuşuyoruz. Bu tüm farkı yaratır. – Thomas

5

== ille bir örneği türetilmiş

Aslında (==) Denk bir örneği gerektirir Denk

türetilmesi için şey gerektirir. Muhtemelen yapmanız gereken, (Value -> IO Value) bölümünü göz ardı eden kendi Eq örneğinizi sağlamaktır. Ör.,

data D = D Int Bool (Value -> IO Value) 

instance Eq D where 
    D x y _ == D x' y' _ = x==x && y==y' 

Bu yardımcı olur mu?

+1

I x == x 'demek istediğini mi düşünüyorsun? – mipadi

+0

bunu yapar ve bunu şimdi – Claudiu

+1

için yaptım Evet, x == x 'demek istediğim buydu. –

3

Ben işaretçi eşitlik var başka bir dil için bir tercüman oluşturuyorsam, bu yüzden hala kapanışları modellemek için Haskell fonksiyonlarını kullanabilmek için olurken ben modeline bu davranışı çalışıyorum.

Böyle bir yorumcu yazabilmek için kodunuzun monadik olması gerektiğinden eminim. Bir çeşit çevre veya devlet bulundurmak zorunda değil misin? Eğer öyleyse, fonksiyon kapanışları için bir sayaç da tutabilirsiniz. Böylece, yeni bir kapatma oluşturduğunuzda bunu benzersiz bir kimlikle donatırsınız. Daha sonra işaretçi denkliği için bu tanımlayıcıları karşılaştırırsınız.

3

Bunu yapmanın başka bir yolu, StableNames'i kullanmaktır. Bununla birlikte, güvensizPerformio'yu kötüye kullanmak istemedikçe, sonuçları IO monadının içerisine geri döndürmek zorundadır.

IORef çözümü, yapınızın yapısı boyunca IO gerektirir. StableNames'in kontrol edilmesi yalnızca referans eşitliğini kontrol etmek istediğinizde kullanır.

+1

Bu, fonksiyon eşitliğini kontrol etmek için oldukça iyi bir çözümdür, çünkü StableName her zaman sezgisel olarak göründüğü zaman eşdeğer değildir. Sadece dokümanlar için bir bağlantı eklemek istedim: http://hackage.haskell.org/package/base-4.7.0.2/docs/System-Mem-StableName.html –

İlgili konular