Haskell'deki listelerle ilgili olarak "@" sembolü ne anlama geliyor?


128

Şuna benzeyen bir Haskell koduyla karşılaştım:

ps@(p:pt)

@Bu bağlamda sembol ne anlama geliyor? Google'da herhangi bir bilgi bulamıyorum (maalesef Google'da sembol aramak zor) ve işlevi Prelude belgelerinde bulamıyorum, bu yüzden bunun bir çeşit sözdizimsel şeker olması gerektiğini düşünüyorum.


14
O belirli sembolü aramaya çalışmayın. Genel olarak Haskell sözdizimini arayın ve ardından bu genel tartışmada sembolü bulun. Örneğin, "Haskell sözdizimi" için en iyi Google sonucu: cs.utep.edu/cheon/cs3360/pages/haskell-syntax.html . @O sayfada ikinci kez geçtiği şey bunu açıklıyor.
Rob Kennedy

1
İyi ki, @Iter URL'sini tam olarak nasıl bulduğumdan bahsetmiştim. Herkes bugün süreci tekrarlayabilir ve bulduğu sayfada cevabı bulabilir.
Rob Kennedy

Yanıtlar:


179

Evet, @"as" olarak yüksek sesle okunan sözdizimsel şekerdir . ps@(p:pt)sana isimler verir

  1. liste: ps
  2. listenin başı: p
  3. listenin kuyruğu: pt

Bu olmadan, @(1) veya (2) :( 3) arasında seçim yapmanız gerekir.

Bu sözdizimi aslında herhangi bir kurucu için işe yarar; eğer varsa data Tree a = Tree a [Tree a], o zaman t@(Tree _ kids)hem ağaca hem de onun çocuklarına erişmenizi sağlar.


3
bu sözdiziminin adını biliyor musunuz?
danza

7
Buna "as-pattern" denir
adamo

41

@Sembol bir parametreye bir isim vermek ve takip eden desen karşı parametreyi maç hem kullanılır @. Listelere özgü değildir ve diğer veri yapılarıyla da kullanılabilir.

Bu, bir parametreyi parçalarına ayırmak istiyorsanız, ancak yine de parametreye fonksiyonunuzun herhangi bir yerinde bir bütün olarak ihtiyaç duyuyorsanız yararlıdır. Durumun böyle olduğu bir örnek tails, standart kitaplıktaki işlevdir:

tails                   :: [a] -> [[a]]
tails []                =  [[]]
tails xxs@(_:xs)        =  xxs : tails xs

21

Bunun @her seviyede işe yaradığını eklemek istiyorum , yani şunu yapabilirsiniz:

let a @ (b @ (Just c), Just d) = (Just 1, Just 2) in (a, b, c, d)

Daha sonra bunu üretecek: ((Just 1, Just 2), Just 1, 1, 2)

Yani temelde bu, bir kalıbı bir değere bağlamanın bir yoludur. Bu aynı zamanda , yukarıda gösterildiği gibi sadece listelerle değil, her tür modelle çalıştığı anlamına gelir . Bu, onu daha birçok durumda kullanabileceğiniz anlamına geldiğinden, bilmek çok yararlı bir şey.

Bu durumda, atüm olup Maybe Tuple, bsadece ilk Justdemet içinde ve cve dbirinci ve ikinci alan değerlerdir Justsırasıyla demet içinde


9

Diğer insanların söylediklerine ek olarak, onlara kalıplar denir (ML'de sözdizimi "as" anahtar sözcüğünü kullanır) ve Haskell Raporunun kalıplar bölümünde açıklanır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.