จะเป็นไรไหมถ้าฉันตัดสินใจเขียน Ruby ทั้งหมดของฉันราวกับว่าเป็น Haskell


10

ระบุว่า Ruby มีความสามารถในการดำเนินการรายการที่ดีในตัว - ลดแผนที่เลือกรวบรวม ฯลฯ มันมี Procs บล็อกและ Lambdas และมีการสนับสนุนการทำซ้ำที่ดี ( eachครอบครัว) มันจะเป็นการตัดสินใจที่ไม่ดีถ้าฉันพยายาม เขียนข้อมูล Ruby ทั้งหมดของฉันด้วยวิธีการที่บริสุทธิ์ที่สุด โดยเฉพาะอย่างยิ่งสำหรับโค้ดที่มี I / O น้อยหรือไม่มีเลย

ฉันได้เรียนรู้ Haskell (เรียกว่าภาษาแฮ็กเกอร์ 'ของจริง') และฉันรักมันเป็นวิธีการทำสิ่งต่าง ๆ - ฉันรัก Ruby แต่คิดว่ามันน่าสนุกกว่าเดิมเมื่อวิญญาณ Haskell ไหลเข้ามา Ruby ยืม / เรียนรู้อะไรมากมายตั้งแต่แรก)

ยินดีต้อนรับคำแนะนำที่สร้างสรรค์ ...


13
ทำไมไม่ลองเขียนใน Haskell ดูล่ะ?

1
ฉันจะเขียนใน Haskell เพียงอย่างเดียว แต่ทับทิมก็ไม่ได้เลวร้ายอย่างที่ควรจะถูกโยนทิ้งไปโดยสิ้นเชิง ฉันชอบความจริงที่ว่าฉันสามารถใช้งานได้ตอนเขียนสคริปต์และสำหรับการทดลองที่รวดเร็วมากมายฉันชอบแฮ็กด้วยกันเมื่อเรียนรู้เรื่อง AI แต่อาจเป็นเพราะฉันเพิ่งเริ่มเรียนรู้ Haskell อาจทำตามคำแนะนำของคุณในที่สุด :-)
nemesisfixx

2
ฉันไม่เข้าใจว่าทำไมคุณจึงขอสิทธิ์ Stack Overflow หากคุณกำลังเขียนโค้ดที่คุณจะแชร์กับคนอื่นในทีมคุณจะต้องประสานงานกับสไตล์การเขียนโค้ดของคุณอยู่ดี มิฉะนั้นมันมีความสำคัญอะไร?
Mike Daniels

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

เมื่อพิจารณาว่ามีเหตุผลวัตถุประสงค์ "ไม่" นี่เป็นคำถามที่ถูกกฎหมาย
Andrew Grimm

คำตอบ:


16

ฉันทำสิ่งนี้กับงูหลาม ฉันพบว่ามันยุ่งยากในการเขียนในลักษณะการทำงานที่บริสุทธิ์ทางพันธุกรรมในภาษาที่ไม่ได้ออกแบบมาสำหรับมัน ตัวอย่างเช่นเปรียบเทียบสองคำจำกัดความของin_order :

def in_order(xs):
    for i in range(1,len(xs)):
        if xs[i] > xs[i+1]:
            return False
    return True

inOrder :: (Ord a) => [a] -> Bool
inOrder xs = and $ zipWith (<=) xs (tail xs)

การเขียนin_orderวิธี Haskell ใน python จะเป็นทั้ง verbose (เนื่องจาก python ไม่รองรับสำนวนที่จำเป็นมาก) และช้า (พื้นที่เชิงเส้นแทนพื้นที่คงที่ของ Haskell เนื่องจากความเกียจคร้าน)

อย่างไรก็ตามฉันประสบความสำเร็จในการสร้างโปรแกรมหลามด้วยการจัดระเบียบหน้าที่และการใช้สำนวนของแต่ละฟังก์ชั่น แนวคิดที่ว่านี่เป็นวิธีที่ดีในการเขียนโปรแกรมจริงๆแล้วเป็นวิทยานิพนธ์ที่อยู่เบื้องหลังโครงการcodecatalogของฉัน ดังนั้นส่วนประกอบของฉันจะเน้นไปที่ abstractions และฟังก์ชั่น (ด้วยinterfaceบริสุทธิ์) ที่ทำงานกับมันมากกว่าคลาสที่มี state และมันก็มารวมกันอย่างดี ในความเป็นจริงการจัดระเบียบรหัสด้วยวิธีนี้ดูเหมือนว่าจะมีความยืดหยุ่นในการใช้ซ้ำมากกว่ารหัสที่จัดระเบียบด้วยคลาส นั่นอาจเป็นอคติส่วนตัวเนื่องจากฉันยังเป็นผู้นับถือศรัทธาของ Haskell อยู่

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


คำอธิบายของคุณทำให้ฉันคิดถึงปาสกาล
rasjani

@rasjani โอ้ เหตุผลใด

ฉันไม่รู้ว่ามันอาจจะขาดความเข้าใจภาษาอังกฤษได้ดีหรือสิ่งที่คุณอธิบายไว้นั้นเหมาะสมกับสิ่งที่ฉันจัดเรียง / โครงสร้างในหน่วยปาสกาล เพียงแค่การจัดเรียงของการเชื่อมต่อทางจิตอาจจะไม่ได้มีการเชื่อมต่อที่แท้จริงเจ้าเนื่องจากตัวเลือกแรก;)
rasjani

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

3
@ aromero ฉันไม่เข้าใจคุณเลย คำสั่งซื้อเกี่ยวข้องกับอะไรบ้าง พื้นที่คงที่มาจากการเก็บขยะของแฮสเค็ลล์หัวของรายการเปรียบเทียบหลังจากandกินมัน มันจะทำงานเหมือนวนรอบ ในขณะที่รายการการเปรียบเทียบของงูเหลือมจะต้องถูกสร้างขึ้นอย่างเต็มรูปแบบก่อนที่จะมีการเปรียบเทียบแบบอะนาล็อกandของพวกเขา (เว้นแต่คุณจะใช้เครื่องกำเนิดไฟฟ้า ... ซึ่งฉันคิดว่าเป็นไปได้)

7

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


1

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

สถานการณ์การโหลดโมดูล / โค้ดนั้นสุดเหวี่ยงสำหรับสิ่งหนึ่ง ล่ามปัจจุบันไม่ได้เปิดใช้การปรับการเรียกหางให้เหมาะสมดังนั้นคุณไม่สามารถใช้การเรียกซ้ำในลักษณะที่คุณทำใน Haskell ได้ และเมื่อคุณเข้าสู่ Monads แล้วจะไม่มีการเปรียบเทียบระดับของนามธรรมที่คุณสามารถทำได้ใน Haskell vs. Ruby

หากคุณสนใจฉันได้โพสต์โค้ดเปรียบเทียบ Ruby / Haskell ลงในgist.github.comตามที่ฉันได้เรียนรู้มาแล้ว

เทคนิคที่ฉันนำมาสู่ Ruby ซึ่งได้ผลดีที่สุดคือการค้นหาฟังก์ชั่นบริสุทธิ์ที่ฉันสามารถทำได้ซึ่งเป็นสิ่งที่ดูเหมือนว่าคุณกำลังพยายามทำอยู่


self assert: ((m >>= f) >>= g) equals: (m >>= [:x | (f value: x) >>= g])ในตอนหนึ่งของการทดสอบสมอลล์ทอล์คฉัน: ไม่มีเหตุผลเลยว่าทำไมคุณไม่สามารถใช้ Monads อย่างมีสติซึ่งต่างกับการใช้โดยไม่ได้รู้ว่าคุณกำลังใช้ (เช่นรายการ)
Frank Shearar

0

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

สิ่งที่ยอดเยี่ยมเกี่ยวกับทับทิมคือมันช่วยให้คุณเขียนโค้ดในลักษณะเชิงเส้นแบบเชิงวัตถุหรือแบบใช้งานได้หรือผสมผสานบางอย่างเข้าด้วยกัน และสคริปต์เชิงเส้นที่เรียบง่ายของคุณสามารถแปรเปลี่ยนเป็น OO / สไตล์การใช้งานได้หากและเมื่อความซับซ้อนเพิ่มขึ้น


0

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

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