คำถามติดแท็ก fold

ในการเขียนโปรแกรมเชิงฟังก์ชันการพับหรือที่เรียกอีกอย่างว่าการลดการสะสมหรือการสลายตัวเป็นประเภทของฟังก์ชันลำดับที่สูงกว่าที่ใช้การแปลงแบบซ้ำกับโครงสร้างข้อมูลโดย "ยุบ" เป็นค่าสรุป

7
ความแตกต่างระหว่าง foldLeft และลด leeft ใน Scala
ฉันได้เรียนรู้ความแตกต่างพื้นฐานระหว่างfoldLeftและreduceLeft foldLeft: ค่าเริ่มต้นจะต้องถูกส่งผ่าน reduceLeft: ใช้องค์ประกอบแรกของการรวบรวมเป็นค่าเริ่มต้น พ่นข้อยกเว้นถ้าคอลเลกชันว่างเปล่า มีความแตกต่างอื่น ๆ อีกไหม? เหตุผลใดที่มีสองวิธีที่มีฟังก์ชั่นคล้ายกัน


7
ผลกระทบของ foldr กับ foldl (หรือ foldl ')
ประการแรกโลกแห่งความจริง Haskellซึ่งฉันอ่านกล่าวว่าจะไม่เคยใช้และแทนที่จะใช้foldl foldl'ดังนั้นฉันจึงเชื่อมั่น แต่ฉันมีหมอกในเมื่อจะใช้กับfoldr foldl'แม้ว่าฉันจะสามารถเห็นโครงสร้างของวิธีการทำงานของพวกเขาที่แตกต่างออกไปตรงหน้าฉันก็โง่เกินกว่าที่จะเข้าใจว่า "ซึ่งดีกว่า" ฉันคิดว่ามันดูเหมือนว่าฉันไม่ควรทำเรื่องสำคัญซึ่งใช้เพราะพวกเขาทั้งคู่ให้คำตอบเดียวกัน (ไม่ใช่พวกเขา?) ในความเป็นจริงประสบการณ์ก่อนหน้าของฉันกับโครงสร้างนี้มาจาก Ruby injectand Clojure's reduceซึ่งดูเหมือนจะไม่มีเวอร์ชั่น "ซ้าย" และ "ถูกต้อง" (คำถามด้านข้าง: พวกเขาใช้เวอร์ชันใด) ข้อมูลเชิงลึกใด ๆ ที่สามารถช่วยคัดสรรที่ท้าทายเช่นฉันจะได้รับการชื่นชมมาก!

3
ความแตกต่างพื้นฐานระหว่างการพับและลดใน Kotlin คืออะไร? ควรใช้เมื่อใด
ฉันค่อนข้างสับสนกับทั้งสองฟังก์ชั่นนี้fold()และreduce()ใน Kotlin ใครช่วยยกตัวอย่างที่เป็นรูปธรรมที่ทำให้ทั้งสองอย่างเห็นได้ชัด
134 kotlin  reduce  fold 

4
ลักษณะการทำงานของ foldl กับ foldr กับรายการที่ไม่มีที่สิ้นสุด
รหัสสำหรับฟังก์ชัน myAny ในคำถามนี้ใช้ตัวพับ หยุดการประมวลผลรายการที่ไม่มีที่สิ้นสุดเมื่อเพรดิเคตเป็นที่พอใจ ฉันเขียนใหม่โดยใช้ foldl: myAny :: (a -> Bool) -> [a] -> Bool myAny p list = foldl step False list where step acc item = p item || acc (โปรดสังเกตว่าอาร์กิวเมนต์ของฟังก์ชัน step จะถูกย้อนกลับอย่างถูกต้อง) อย่างไรก็ตามจะไม่หยุดประมวลผลรายการที่ไม่มีที่สิ้นสุดอีกต่อไป ฉันพยายามติดตามการดำเนินการของฟังก์ชันตามคำตอบของ Apocalisp : myAny even [1..] foldl step False [1..] step (foldl step False …

4
ความแตกต่างระหว่างพับและลด?
พยายามเรียนรู้ F # แต่มีสับสนเมื่อพยายามที่จะแยกแยะความแตกต่างระหว่างการพับและลด การพับดูเหมือนจะทำสิ่งเดียวกันแต่ใช้พารามิเตอร์พิเศษ มีเหตุผลอันชอบธรรมที่ทำให้ฟังก์ชันทั้งสองนี้มีอยู่หรือมีขึ้นเพื่อรองรับผู้ที่มีภูมิหลังที่แตกต่างกัน? (เช่น: สตริงและสตริงใน C #) นี่คือข้อมูลโค้ดที่คัดลอกมาจากตัวอย่าง: let sumAList list = List.reduce (fun acc elem -> acc + elem) list let sumAFoldingList list = List.fold (fun acc elem -> acc + elem) 0 list printfn "Are these two the same? %A " (sumAList [2; 4; 10] …

9
อะไรคือ 'pythonic' เทียบเท่ากับฟังก์ชัน 'fold' จากการเขียนโปรแกรมเชิงฟังก์ชัน
อะไรคือวิธีที่เป็นสำนวนที่สุดในการบรรลุสิ่งต่อไปนี้ใน Haskell: foldl (+) 0 [1,2,3,4,5] --> 15 หรือเทียบเท่าใน Ruby: [1,2,3,4,5].inject(0) {|m,x| m + x} #> 15 เห็นได้ชัดว่า Python มีreduceฟังก์ชันซึ่งเป็นการใช้งานแบบพับตามที่กล่าวข้างต้นอย่างไรก็ตามฉันได้รับแจ้งว่าวิธีการเขียนโปรแกรมแบบ 'pythonic' คือการหลีกเลี่ยงlambdaคำศัพท์และฟังก์ชันลำดับที่สูงกว่าโดยเลือกใช้ความเข้าใจในรายการหากเป็นไปได้ ดังนั้นจึงมีวิธีที่ดีกว่าในการพับรายการหรือโครงสร้างแบบรายการใน Python ที่ไม่ใช่reduceฟังก์ชันหรือเป็นreduceวิธีที่เป็นสำนวนในการบรรลุสิ่งนี้หรือไม่?

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

4
ความแตกต่างระหว่าง Reduce และ foldLeft / fold ในการเขียนโปรแกรมเชิงฟังก์ชัน (โดยเฉพาะ Scala และ Scala APIs)
ทำไม Scala และเฟรมเวิร์กเช่น Spark และ Scalding จึงมีทั้งสองอย่างreduceและfoldLeft? แล้วอะไรคือความแตกต่างระหว่างreduceและfold?

3
การใช้คำนี้ฟังก์ชั่นเป็นไปได้โดยไม่ต้องขั้นตอน postprocessing หลังจากพับหรือไม่?
Real World Haskell, ตอนที่ 4, หน้า 98 ของการพิมพ์ถามว่าwordsสามารถนำไปใช้โดยใช้ folds หรือไม่และนี่คือคำถามของฉันเช่นกัน: เป็นไปได้ไหม? ถ้าไม่ทำไม ถ้ามันเป็นอย่างไร ฉันคิดว่าสิ่งต่อไปนี้จะขึ้นอยู่กับความคิดที่ว่าแต่ละช่องว่างควรจะเติมคำสุดท้ายในรายการเอาท์พุท (นี้เกิดขึ้นในotherwiseยาม) และช่องว่างที่ควรจะเพิ่มคำ emtpy รายการเอาท์พุทหากยังไม่ได้มีอยู่ (มีการจัดการในif- then- else) myWords :: String -> [String] myWords = foldr step [[]] where step x yss@(y:ys) | x == ' ' = if y == "" then yss else "":yss | …

3
จำเป็นต้องมีความรู้หรือการฝึกอบรมประเภทใดสำหรับคนที่จะเขียนคำจำกัดความของ foldlM แบบนี้ [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน7 เดือนที่ผ่านมา เมื่อเร็ว ๆ นี้ฉันพยายามใช้ Haskell ในระบบการผลิตกรณีจริงของฉัน ระบบประเภท Haskell ให้ความช่วยเหลือฉันอย่างมาก ตัวอย่างเช่นเมื่อฉันรู้ว่าฉันต้องการฟังก์ชั่นบางประเภท f :: (Foldable t, Monad m) => ( a-> b -> m b) -> b -> t a -> m b มีจริงการทำงานเช่นfoldM, และfoldlMfoldrM อย่างไรก็ตามสิ่งที่น่าตกใจจริง ๆ คือนิยามของฟังก์ชั่นเหล่านี้เช่น: foldlM :: (Foldable t, Monad m) => (b …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.