รายการความแตกต่างในการตั้งโปรแกรมการทำงาน


14

คำถามมีอะไรใหม่ในโครงสร้างข้อมูลที่ใช้งานได้จริงตั้งแต่ Okasaki? (และเมื่อเทียบกับการเขียนโปรแกรมเชิงตรรกะ) ซึ่งเป็นสิ่งที่ฉันสนใจเมื่อเร็ว ๆ นี้สิ่งนี้ทำให้ฉันค้นหาการใช้งานรายการความแตกต่างสำหรับ Haskell ฉันมีสองคำถาม (ยกโทษ / แก้ไขให้ฉันถ้าฉันควรทำให้พวกเขาสองคำถามที่แตกต่างกันใน StackExchange)

คำถามง่ายๆคือทุกคนตระหนักถึงการพิจารณาทางวิชาการของรายการที่แตกต่างในการเขียนโปรแกรมการทำงานและ / หรือการใช้งานนอกเหนือจากหนึ่งในห้องสมุด Haskell? คำตอบของ jbapple ไม่ได้อ้างถึงรายการที่แตกต่าง (รายการความแตกต่างในการเขียนโปรแกรมเชิงตรรกะมีอยู่ในตำนานและในแหล่งข้อมูลสองแห่งที่ฉันมีอยู่แถว ๆ นี้ (TM) ก่อนที่จะค้นพบการใช้งาน Haskell ฉันไม่ทราบว่าแนวคิดนั้นเพิ่มขึ้นจากตรรกะไปจนถึงการเขียนโปรแกรมเชิงหน้าที่ จริงอยู่ที่รายการความแตกต่างของ Haskell นั้นเป็นฟังก์ชั่นการใช้งานตามลำดับขั้นสูงและทำงานแตกต่างจากฟังก์ชั่นการเขียนโปรแกรมแบบลอจิก แต่อินเทอร์เฟซคล้ายกันอย่างแน่นอน

สิ่งที่น่าสนใจ (และไกลออกไป) ที่น่าสนใจยิ่งกว่าที่ฉันต้องการถามคือว่าขอบเขตบนแบบ asymptotic ที่อ้างสิทธิ์สำหรับไลบรารีรายการผลต่าง Haskell ดังกล่าวนั้นถูกต้องหรือน่าเชื่อถือ ความสับสนของฉันอาจจะเป็นเพราะฉันหายไปบางสิ่งบางอย่างเกี่ยวกับการที่ชัดเจนเกี่ยวกับเหตุผลที่ซับซ้อนด้วยความเกียจคร้าน แต่ขอบเขตอ้างว่าเพียง แต่จะทำให้รู้สึกถึงฉันถ้าเปลี่ยนตัวมากกว่าโครงสร้างข้อมูลขนาดใหญ่ (หรือการปิดหรือค้นหาตัวแปรหรือบางสิ่งบางอย่าง ) มักจะต้องใช้เวลาอย่างต่อเนื่อง หรือ "จับ" เพียงแค่ว่าไม่มีเวลา จำกัด สำหรับ "หัว" และ "หาง" อย่างแม่นยำเพราะการดำเนินการเหล่านั้นอาจต้องไถผ่านกองโดยพลการของการคำนวณ / การแทนที่ที่รอคอย?


1
ตอนแรกฉันสับสนกับ“ ภาษาโปรแกรมที่ใช้งานได้ (เมื่อเทียบกับภาษาโปรแกรมที่ใช้งานได้)” แต่คุณหมายถึงการเขียน“ (ตรงกันข้ามกับภาษาโปรแกรมตรรกะ)” หรือไม่
Tsuyoshi Ito

โอ้โอ้นั่นคือสิ่งที่ฉันหมายถึงมันได้รับการแก้ไขในขณะนี้
Rob Simmons

คำถามที่สองดูเหมือนจะเหมาะสมกว่าสำหรับ Stack Overflow สำหรับฉัน แต่ตอนนี้คุณได้ถามที่นี่แล้วอาจเป็นการดีกว่าที่จะรอดูว่ามีใครตอบได้ไหม โดยส่วนตัวฉันไม่สามารถหาเหตุผลที่จะสงสัยขอบเขตที่อ้างสิทธิ์จากการอ่านซอร์สโค้ดได้ แต่ฉันไม่ได้ติดตามเหตุผลของคุณที่จะสงสัยพวกเขาและฉันอาจจะพลาดอะไรบางอย่าง
Tsuyoshi Ito

คำตอบ:


9

หรือ "จับ" เพียงแค่ว่าไม่มีเวลา จำกัด สำหรับ "หัว" และ "หาง" อย่างแม่นยำเพราะการดำเนินการเหล่านั้นอาจต้องไถผ่านกองโดยพลการของการคำนวณ / การแทนที่ที่รอคอย?

Θ(m)m

O(1) fromList

{-# LANGUAGE NoMonomorphismRestriction #-}

data DL a = Id
          | Cons a
          | Compose (DL a) (DL a)

fromList [] = Id
fromList (x:xs) = Compose (Cons x) (fromList xs)

toList x = help x []
    where help Id r = r
          help (Cons a) r = a:r
          help (Compose f g) r = help f $ help g r

empty = Id

singleton = Cons

cons x = append (singleton x)

append = Compose

snoc xs x = append xs (singleton x)

Θ(n)headtail[a] -> [a]toList


ดังนั้นสิ่งที่คุณได้รับจากความเกียจคร้านก็คือการขอให้หางของรายการสองครั้งจะไม่ทำการผ่าตัดที่มีราคาแพงสองครั้งซึ่งเป็นสิ่งที่ดี
Rob Simmons

@ Rob ฉันไม่เข้าใจความหมายของคุณ
jbapple

ฉันคิดว่าจุดที่ฉันพยายามทำ (ไม่ดี) มีตัวอย่างนี้: ฉันมีรายการ "xs" ที่มีความยาวเป็นพิเศษที่ฉันทำโดย "snoc" ซ้ำ ๆ ในรายการต้นฉบับ ครั้งแรกที่ฉันเรียกว่า "head xs" ฉันคาดหวังว่าจะใช้เวลา O (n) ในการคำนวณรอการตัดบัญชี อย่างไรก็ตามเนื่องจากการคำนวณนั้นควรได้รับการจดบันทึกการเรียกครั้งที่สองไปที่ "head xs" (สำหรับ"xs" เดียวกัน ) ควรใช้เวลา O (1)
Rob Simmons

1
ฉันเห็นด้วยกับสิ่งนั้น แต่ความเกียจคร้านที่ฉันอ้างถึงในคำตอบของฉันคือ aboutList ซึ่งไม่ได้ใช้ใน snoc หรือ head ฉันก็สับสนกับคำว่า "อะไร" ในคำพูดของคุณ "สิ่งที่คุณได้รับจากความเกียจคร้าน" ฉันจะบอกว่าตัวอย่างของคุณและของฉันเป็นสองสิ่งที่คุณได้รับจากความเกียจคร้าน
jbapple

ตกลงและการชี้แจงนั้นช่วยให้ฉันเข้าใจจุดก่อนหน้าของคุณได้ดีขึ้นเช่นกัน
Rob Simmons

12

ใช่ขอบเขตขึ้นอยู่กับข้อสันนิษฐานว่าการจัดองค์ประกอบฟังก์ชั่นต้องใช้เวลาคงที่ โดยทั่วไปถ้าคุณมีรายการเข้าร่วม:

datatype 'a join = Nil | Cons of 'a * 'a join | Join of 'a join * 'a join

O(n)

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