สัญลักษณ์“ @” หมายถึงอะไรในการอ้างอิงรายการใน Haskell


128

ฉันเจอโค้ด Haskell ที่มีลักษณะดังนี้:

ps@(p:pt)

อะไร@เป็นสัญลักษณ์หมายถึงในบริบทนี้? ฉันไม่พบข้อมูลใด ๆ ใน Google (น่าเสียดายที่ค้นหาสัญลักษณ์ใน Google ได้ยาก) และฉันไม่พบฟังก์ชันในเอกสาร Prelude ดังนั้นฉันจึงคิดว่ามันต้องเป็นน้ำตาลที่เป็นประโยคแทน


14
อย่าพยายามค้นหาสัญลักษณ์เฉพาะนั้น ค้นหาไวยากรณ์ของ Haskell โดยทั่วไปจากนั้นค้นหาสัญลักษณ์ในการสนทนาโดยรวมนั้น ยกตัวอย่างเช่นด้านบนผลของ Google สำหรับ "ไวยากรณ์ Haskell": cs.utep.edu/cheon/cs3360/pages/haskell-syntax.html เหตุการณ์ที่สอง@ในหน้านั้นอธิบาย
Rob Kennedy

1
สิ่งที่ดีที่ฉันพูดถึงว่าฉันพบ URL นั้นได้อย่างไร @Iter ทุกคนสามารถทำขั้นตอนนี้ซ้ำได้ในวันนี้และค้นหาคำตอบในหน้าใดก็ได้ที่พบ
Rob Kennedy

คำตอบ:


179

ใช่มันเป็นเพียงน้ำตาลที่เป็นประโยคโดย@อ่านออกเสียงว่า "เป็น" ps@(p:pt)ตั้งชื่อให้คุณ

  1. รายการ: ps
  2. หัวของรายการ: p
  3. หางของรายการ: pt

หากไม่มี@คุณจะต้องเลือกระหว่าง (1) หรือ (2) :( 3)

ไวยากรณ์นี้ใช้งานได้จริงสำหรับตัวสร้างใด ๆ ถ้าคุณมีdata Tree a = Tree a [Tree a]ก็t@(Tree _ kids)ให้คุณเข้าถึงทั้งต้นไม้และลูก ๆ ของมัน


3
คุณรู้จักชื่อของไวยากรณ์นี้หรือไม่?
danza

7
เรียกว่า "as-pattern"
adamo

41

สัญลักษณ์ที่ใช้ในการทั้งชื่อให้กับพารามิเตอร์และตรงกับพารามิเตอร์ที่ผิดรูปแบบที่ตามมา@ @ไม่เฉพาะเจาะจงสำหรับรายการและยังสามารถใช้กับโครงสร้างข้อมูลอื่น ๆ ได้

สิ่งนี้มีประโยชน์หากคุณต้องการ "สลาย" พารามิเตอร์เป็นส่วน ๆ ในขณะที่ยังต้องการพารามิเตอร์โดยรวมในฟังก์ชันของคุณ ตัวอย่างหนึ่งในกรณีนี้คือtailsฟังก์ชันจากไลบรารีมาตรฐาน:

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

21

ฉันต้องการเพิ่มที่ใช้@งานได้ในทุกระดับซึ่งหมายความว่าคุณสามารถทำได้:

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

ซึ่งจะสร้างสิ่งนี้: ((Just 1, Just 2), Just 1, 1, 2)

โดยพื้นฐานแล้วมันเป็นวิธีที่คุณจะผูกรูปแบบกับค่า นอกจากนี้ยังหมายความว่ามันใช้งานได้กับรูปแบบทุกประเภทไม่ใช่แค่รายการตามที่แสดงไว้ข้างต้น นี่เป็นสิ่งที่มีประโยชน์มากที่ควรทราบเนื่องจากหมายความว่าคุณสามารถใช้งานได้ในหลาย ๆ กรณี

ในกรณีนี้aคือทั้งหมดMaybe Tuple, bเป็นเพียงครั้งแรกJustใน tuple และcและdเป็นค่าที่มีอยู่ในครั้งแรกและครั้งที่สองJustใน tuple ตามลำดับ


9

หากต้องการเพิ่มกับสิ่งที่คนอื่น ๆ ได้กล่าวว่าพวกเขาจะเรียกว่าเป็นรูปแบบการ (ML ในไวยากรณ์การใช้คำว่า "เป็น") และอธิบายไว้ในส่วนของ Haskell รายงานในรูปแบบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.