2015-05-19 48 views
7

Ben googling denedim ama kısa gelmek. Bazı makaleleri okuyarak Haskell bilgimi genişletiyorum ve daha önce hiç görmediğim bir sözdizimi kullanan birine rastladım. şöyle bir örnek verilebilir: Bunları hiç görmedimHaskell'de '@' ne anlama geliyor?

reconstruct [email protected](Node a b c l r) [email protected](Node b d le ri) 

@ 'önce bu. Bir cevabı bulmak için çevrimiçi arama yapmayı denedim, ancak kısa sürdü. Bu, işleri daha açık hale getirmek için etiketler yerleştirmenin bir yolu mu yoksa kod üzerinde gerçek bir etkisi var mı?

+0

Bir giriş için http://learnyouahaskell.com/syntax-in-functions#pattern-matching adresinde "desen olarak" arayın. – Jubobs

+7

Geleneksel arama motorları, özel karakterler ararken yararlı sonuçlar döndürmezken, Haskell'in bu tür sorular için kendi [hoogle’ı genellikle oldukça yararlıdır] (https://www.haskell.org/hoogle/?hoogle=%40). – ComicSansMS

+0

@ComicSansMS Daha sonra yardımcı cevap! –

cevap

13

Model eşleştirmede kullanılır. Şimdi node değişkeni, Node a b c l r argümanı için tüm Node veri tipine atıfta bulunacaktır. Bu nedenle, Node a b c l r işlevine geçmek yerine, iletmek için node kullanabilirsiniz.

Daha basit bir örnek bunu göstermek için:

data SomeType = Leaf Int Int Int | Nil deriving Show 

someFunction :: SomeType -> SomeType 
someFunction [email protected](Leaf _ _ _) = leaf 
someFunction Nil = Leaf 0 0 0 

someFunction olarak da yazılabilir:

someFunction :: SomeType -> SomeType 
someFunction (Leaf x y z) = Leaf x y z 
someFunction Nil = Leaf 0 0 0 

ilk sürümü nasıl daha basit görüyor musunuz?

+0

Daha da basit olan 'bazıFunction yaprak @ Leaf {} = yaprak' olur. –

+2

@ AndrásKovács, ancak 'Leaf {} 'üzerinde bazı açıklamalar gerektirmiyor mu? – d12frosted

+0

Tamam, şimdi anlıyorum. Teşekkürler! :-) – Rewbert