pเป็นฟังก์ชั่น (ประเภทคลาส polymorphic) ที่ใช้การเรียงสับเปลี่ยนเป็นรายการของInts และรายการซ้อนที่แสดงอาร์เรย์หลายมิติของInts
โทรเป็นp [2,1] [[10,20,30],[40,50,60]]อย่างไรก็ตามหากการเริ่มต้นประเภทไม่สำเร็จคุณอาจต้องเพิ่มคำอธิบายประกอบประเภทเช่น:: [[Int]](ซ้อนกันอย่างเหมาะสม) ให้ประเภทของผลลัพธ์
import Data.List
class P a where p::[Int]->[a]->[a]
instance P Int where p _=id
instance P a=>P[a]where p(x:r)m|n<-p r<$>m,y:z<-sort r=last$n:[p(x:z)<$>transpose n|x>y]
ลองออนไลน์!
ความท้าทายในการตีกอล์ฟกับอาเรย์ที่ซ้อนกันของความลึกตามอำเภอใจนั้นค่อนข้างน่าอึดอัดใจใน Haskell เนื่องจากการพิมพ์แบบสแตติกมีแนวโน้มที่จะเข้าใกล้ ในขณะที่รายการ Haskell (ที่มีไวยากรณ์เดียวกับในคำอธิบายการท้าทาย) สามารถซ้อนกันได้ดีรายการของความลึกการซ้อนที่แตกต่างกันเป็นประเภทที่ไม่สามารถใช้ร่วมกันได้ ฟังก์ชั่นการแยกวิเคราะห์แบบมาตรฐานของ Haskell จำเป็นต้องทราบชนิดของค่าที่คุณพยายามแยกวิเคราะห์
เป็นผลให้ดูเหมือนว่าโปรแกรมจะต้องมีการประกาศที่เกี่ยวข้องกับประเภทซึ่งค่อนข้าง verbose สำหรับชิ้นส่วน golfed ฉันตัดสินโดยการกำหนดประเภทคลาสPเช่นที่pสามารถ polymorphic ผ่านประเภทของอาร์เรย์
ในขณะเดียวกันชุดทดสอบของ TIO แสดงวิธีการแก้ไขปัญหาการแยกวิเคราะห์
มันทำงานอย่างไร
- เพื่อสรุปสาระสำคัญของอัลกอริธึมนี้: มันทำการเรียงลำดับฟองอากาศในรายการการเปลี่ยนแปลงโดยการย้ายมิติที่อยู่ใกล้เคียงเมื่อดัชนีการเปลี่ยนแปลงที่สอดคล้องกันถูกสลับ 
- ตามที่กำหนดไว้โดยการ- class P aประกาศในกรณีใด ๆ- pจะใช้เวลาสองข้อโต้แย้งการเปลี่ยนแปลง (ประเภทเสมอ- [Int]) และอาร์เรย์
 
- การเปลี่ยนแปลงสามารถให้ในแบบฟอร์มในคำอธิบายการท้าทายถึงแม้ว่าวิธีการทำงานของอัลกอริทึมตัวเลือกของดัชนีมีอิสระโดยพลยกเว้นสำหรับลำดับญาติ (ดังนั้นการทำงานทั้ง 0- และ 1)
- ฐานinstance P Intจัดการอาร์เรย์ของมิติ 1 ซึ่งpส่งกลับค่าไม่เปลี่ยนแปลงเนื่องจากมิติเดียวสามารถแมปกับตัวเองเท่านั้น
- อีกชุดหนึ่งinstance P a => P [a]ถูกกำหนดแบบเรียกซ้ำpด้วยการเรียกมิติย่อยnเพื่อกำหนดให้มิติอาร์เรย์
 n + 1
- p(x:r)mการเรียกครั้งแรก- p rซ้ำ ๆ ในทุก ๆ องค์ประกอบของการ- mให้อาร์เรย์ผล- nที่ทุกมิติยกเว้นการแรกได้รับอนุญาตอย่างถูกต้องค่อนข้างสัมพันธ์กัน
- ส่วนที่เหลืออีกการเปลี่ยนแปลงที่จะต้องดำเนินการบนจะได้รับจากnx:y:z = x:sort r
- หากx<yมิติแรกของnวางไว้อย่างถูกต้องแล้วจะถูกnส่งกลับ
- ถ้าหากจำเป็นต้องสลับx>yมิติแรกและมิติที่สองnซึ่งทำกับtransposeฟังก์ชัน สุดท้ายp(x:z)จะถูกนำไปใช้ซ้ำกับองค์ประกอบทุกส่วนของผลลัพธ์เพื่อให้แน่ใจว่ามิติแรกเริ่มแรกถูกย้ายไปยังตำแหน่งที่เหมาะสม
 
 
              
exec(บันทึกสองไบต์)เนื่องจากเป็นคำสั่งใน Python 2