2016-07-03 47 views
5

için, örneğinMonadFix örneği []

instance MonadFix [] where 
    mfix f = case fix (f . head) of 
      [] -> [] 
      (x:_) -> x : mfix (tail . f) 

olarak tanımlanır Ama deterministik olmayan hesaplamalar olarak görülen [] monadın göre arkasında sezgisel anlamını kavramak için başarısız ediyorum. işlevinde, f işlevinde argümanında katı olmamalıdır, bu nedenle bağımsız değişken incelenemez. Ve tanıma göre, argümanı çıktılarının herhangi bir yerinde kullanamazsınız, aksi halde bir noktada fix (f . head)'a çarpıp uzaklaşır. Yani mfix (const someList) dışındaki listeler için mfix için herhangi bir kullanım (veya iyi örnek) var mı? Aslında sıkı bir işlevi ile bunları kullanmak eğer

+2

"*' f "kendi argümanında katı olmamalıdır *" argümanını tembel olarak inceleyemediği anlamına gelmez. – Bergi

+1

@Bergi İyi nokta. Bir örnekle detaylandırır mısınız? –

cevap

2

Muhtemelen bunu söylemek en kolay olanıdır. mfix f tamamen tanımlanmamış fonksiyonları f, f x omurgası x bağlı değildir kendisi için olanlardır, bu yüzden formda bazı n (muhtemelen sonsuz) ve bazı f1 için

f x = [f1 x, ..., fn x] 

yazılabilir. .., fn. Sonra

mfix f = [fix f1, ..., fix fn] 

(gerçekten tamamen tanımlanması bunun için tabii ki, her fix fi da tanımlanması gerekir).


mfix olarak nondeterministically size nondeterministic fonksiyonun sabit noktası vererek düşünülebilir. Oldukça ağır kısıtlama, nondeterminist hesaplamanın şeklinin girdiye herhangi bir şekilde bağlı olmamasıdır. Başlamak için hesaplamada bir çeşit kısıtlamaya ihtiyacımız var gibi görünmektedir, ancak en azından hesaplamanın bir dalını koşullu olarak öldürebileceğinizi umuyor olabilirsiniz (eğer orta düzeyde bir hesaplama negatifse). Ben her zaman tercih işlemi mfix kullanmak mümkün olacağını düşündüm, ancak seçim işlemi ilişkilendirici olmayan farklı bir nondeterminism monad kullanarak, ama asla ayrıntıları çalıştı.

+0

Yani, ilk verdiğim gibi örneklerin, bu “mfix” in tek tek kullanımdan uzaklaştığını söylüyorsun? – leftaroundabout

0

tamamı fix varyantları bir sorun var, ama bu genellikle gerçek kullanımda bir sorun durumda& hançer değil;: a temel olarak her zaman bir işlev türüdür ve herhangi bir lambda zaten NF'dir.

f :: (Int -> Int) -> [Int -> Int]

f f' = [\x -> if x>0 then f' (x-1) * i else 1 | i<-[0..]]

f temelde oluşturur:

Yani, somut bir kullanım için olduğu gibi ... iyi, burada birleşir en az şey güç fonksiyonlarının listesi. Emin değilim bu aslında yararlıdır Ne [0,0,1,1,2,4,3,9,4,16,5,25,6,36,7,49,8,64,9,81]

GHCi> take 20 $ mfix f <*> [1,2]

ama oldukça ilginç bir davranış var.

Sadece bunun tek bir fix (f . head) eşdeğeri olduğu için bunun kötü bir örnek olduğunu fark ettim. Hl ...


& dagger; Tam olarak doğru görünüyorsunuz: numaralı belgede bir sorun olduğundan, liste yapısını kesinleşmeden argümana bağımlı hale getirmenin açık bir yolu yoktur.