คำถามติดแท็ก higher-order-functions

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

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

11
ฉันจะระเบิดและตัดช่องว่างได้อย่างไร
ตัวอย่างเช่นฉันต้องการสร้างอาร์เรย์จากองค์ประกอบในสตริงนี้: $str = 'red, green, blue ,orange'; ฉันรู้ว่าคุณสามารถระเบิดและวนรอบพวกเขาและตัดแต่ง: $arr = explode(',', $str); foreach ($arr as $value) { $new_arr[] = trim($value); } แต่ฉันรู้สึกเหมือนมีวิธีการหนึ่งบรรทัดที่สามารถจัดการกับสิ่งนี้ได้ ความคิดใด ๆ

4
วิธีใช้ ES6 Fat Arrow เพื่อ. filter () อาร์เรย์ของวัตถุ
ฉันกำลังพยายามใช้ฟังก์ชั่นลูกศร ES6 .filterเพื่อส่งคืนผู้ใหญ่ (แจ็ค & จิล) ดูเหมือนว่าฉันไม่สามารถใช้คำสั่ง if ฉันต้องรู้อะไรบ้างเพื่อที่จะทำสิ่งนี้ใน ES6 var family = [{"name":"Jack", "age": 26}, {"name":"Jill", "age": 22}, {"name":"James", "age": 5 }, {"name":"Jenny", "age": 2 }]; let adults = family.filter(person => if (person.age > 18) person); // throws error (8:37) SyntaxError: unknown: Unexpected token (8:37) |let adults = family.filter(person …

1
Paramorphisms คืออะไร?
เมื่ออ่านบทความคลาสสิกนี้ฉันติดอยู่กับพารามอร์ฟิสม์ น่าเสียดายที่ส่วนนี้ค่อนข้างบางและหน้า Wikipedia ไม่ได้พูดอะไรเลย การแปล Haskell ของฉันคือ: para :: (a -> [a] -> b -> b) -> b -> [a] -> b para f base = h where h [] = base h (x:xs) = f x xs (h xs) แต่ฉันไม่เอะใจนั่น - ฉันไม่มีสัญชาตญาณใด ๆ สำหรับลายเซ็นประเภทหรือผลลัพธ์ที่ต้องการ พารามอร์ฟิสซึมคืออะไรและมีตัวอย่างใดบ้างที่เป็นประโยชน์ในการดำเนินการ ใช่ฉันเคยเห็นคำถามเหล่านี้ แต่ไม่ครอบคลุมถึงพารามอร์ฟิสโดยตรงและชี้ไปที่แหล่งข้อมูลที่อาจเป็นประโยชน์ในการอ้างอิงเท่านั้น แต่ไม่ใช่เป็นสื่อการเรียนรู้

2
ฟังก์ชันลำดับสูงกว่าเช่น. map () ทำงานภายใน JavaScript ได้อย่างไร
ทุกวันนี้ทุกคนพยายามที่จะใช้ฟังก์ชั่นลำดับสูงเหล่านี้เพื่อให้ได้ผลลัพธ์ที่มีแนวโน้มโดยการเขียนโค้ดน้อย แต่ฉันสงสัยว่าฟังก์ชั่นเหล่านี้ทำงานอย่างไรภายใน สมมติว่าถ้าฉันเขียนบางอย่างเช่น var numbers = [16, 25, 36]; var results = numbers.map(Math.sqrt); console.log(results); // [4, 5, 6] เรียกใช้ข้อมูลโค้ดซ่อนผลลัพธ์ขยายตัวอย่างข้อมูล ฉันรู้ว่าองค์ประกอบของ 'จำนวน' อาร์เรย์แต่ละวนหนึ่งโดยหนึ่ง แต่วิธี ? ฉันพยายามค้นหา แต่ฉันยังไม่ได้รับคำตอบที่น่าพอใจ

2
Haskell: Typeclass กับการส่งผ่านฟังก์ชัน
สำหรับฉันดูเหมือนว่าคุณสามารถส่งผ่านอาร์กิวเมนต์ของฟังก์ชันได้มากกว่าการใช้ typeclass ตัวอย่างเช่นแทนที่จะกำหนดประเภทความเสมอภาค: class Eq a where (==) :: a -> a -> Bool และใช้มันในฟังก์ชั่นอื่น ๆ เพื่อระบุอาร์กิวเมนต์ชนิดต้องเป็นตัวอย่างของEq: elem :: (Eq a) => a -> [a] -> Bool เราไม่สามารถกำหนดelemฟังก์ชั่นของเราโดยไม่ต้องใช้ตัวพิมพ์ดีดและส่งผ่านอาร์กิวเมนต์ฟังก์ชันที่ทำงานได้หรือไม่

2
การรวมส่วนของ Haskell Code เพื่อให้ได้ภาพที่ใหญ่ขึ้น
นี่คือรหัสที่ฉันเข้ามาบางที่ แต่ต้องการทราบวิธีการทำงาน: findIndices :: (a -> Bool) -> [a] -> [Int] findIndices _ [] = [] findIndices pred xs = map fst (filter (pred . snd) (zip [0..] xs)) ผลลัพธ์: findIndices (== 0) [1,2,0,3,0] == [2,4]โดยที่ pred คือ (== 0) & xs คือ [1,2,0,3,0] ฉันจะแสดงความเข้าใจของฉัน: (zip [0..] xs) บรรทัดข้างต้นทำอะไรได้บ้างนำดัชนีไปสู่ทุกสิ่งในรายการ สำหรับอินพุตที่ระบุข้างต้นมันจะมีลักษณะดังนี้: …

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.