Apa arti simbol "@" dalam referensi ke daftar di Haskell?


128

Saya telah menemukan sepotong kode Haskell yang terlihat seperti ini:

ps@(p:pt)

Apa arti @simbol dalam konteks ini? Sepertinya saya tidak dapat menemukan info di Google (sayangnya sulit untuk mencari simbol di Google), dan saya tidak dapat menemukan fungsinya di dokumentasi Prelude, jadi saya membayangkan itu pasti semacam gula sintaksis sebagai gantinya.


14
Jangan mencoba mencari simbol spesifik itu. Cari sintaksis Haskell secara umum, dan kemudian temukan simbol dalam keseluruhan diskusi itu. Misalnya, hasil Google teratas untuk "Sintaks Haskell": cs.utep.edu/cheon/cs3360/pages/haskell-syntax.html . Kemunculan kedua @pada halaman itu menjelaskannya.
Rob Kennedy

1
Untung saya sebutkan persis bagaimana saya menemukan URL itu, @Iter. Siapa pun dapat mengulangi prosesnya hari ini dan menemukan jawabannya di halaman apa pun yang mereka temukan.
Rob Kennedy

Jawaban:


179

Ya, itu hanya gula sintaksis, dengan @membaca keras-keras sebagai "sebagai". ps@(p:pt)memberi Anda nama untuk

  1. Daftar: ps
  2. kepala daftar: p
  3. ekor daftar: pt

Tanpa @, Anda harus memilih antara (1) atau (2) :( 3).

Sintaks ini sebenarnya berfungsi untuk konstruktor apa pun; jika sudah data Tree a = Tree a [Tree a], maka t@(Tree _ kids)memberi Anda akses ke pohon dan anak-anaknya.


3
Anda tahu nama untuk sintaks ini?
danza

7
Ini disebut "as-pattern"
adamo

41

The @Symbol digunakan untuk kedua memberi nama untuk parameter dan sesuai dengan yang parameter terhadap pola yang mengikuti @. Ini tidak spesifik untuk daftar dan juga dapat digunakan dengan struktur data lainnya.

Ini berguna jika Anda ingin "mendekomposisi" suatu parameter menjadi bagian-bagiannya sementara masih membutuhkan parameter secara keseluruhan di suatu tempat di fungsi Anda. Salah satu contoh di mana hal ini terjadi adalah tailsfungsi dari pustaka standar:

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

21

Saya ingin menambahkan yang @berfungsi di semua tingkatan, artinya Anda dapat melakukan ini:

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

Yang kemudian akan menghasilkan ini: ((Just 1, Just 2), Just 1, 1, 2)

Jadi pada dasarnya ini adalah cara bagi Anda untuk mengikat suatu pola ke suatu nilai. Ini juga berarti bahwa ia bekerja dengan segala jenis pola, bukan hanya daftar, seperti yang ditunjukkan di atas. Ini adalah hal yang sangat berguna untuk diketahui, karena itu berarti Anda dapat menggunakannya dalam lebih banyak kasus.

Dalam hal ini, aadalah keseluruhan Maybe Tuple, bhanya yang pertama Justdalam tupel, dan cdan dadalah nilai yang terkandung di Justdalam tupel pertama dan kedua


9

Untuk menambah apa yang dikatakan orang lain, mereka disebut sebagai-pola (dalam ML sintaks menggunakan kata kunci "sebagai"), dan dijelaskan di bagian Laporan Haskell tentang pola .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.