ฉันมีงานที่มีรายการไม่สิ้นสุด
ฉันต้องเขียน zipWith/3 สำหรับรายการที่ไม่มีที่สิ้นสุด - เสร็จแล้ว
ฉันต้องใช้ zipWith/3 นี้เพื่อสร้างรายการหมายเลขฟีโบนักชีที่ไม่มีที่สิ้นสุดด้วย fib/0 - ปัญหา
ฉันต้องเขียน fibs(N) โดยรับองค์ประกอบ N แรกจาก fib() - เสร็จแล้ว
นี่คือสิ่งที่ฉันมีจนถึงตอนนี้:
-module(zipWith).
-export([take/2, zipWith/3, fib/0]).
take(0, _) -> [];
take(N, [H|LazyT]) -> [H | take(N-1, LazyT())].
zipWith(F, [H1|L1], [H2|L2]) -> [F(H1, H2) | fun() -> zipWith(F, L1(), L2()) end].
fib() -> ...
fib(L) -> zipWith(fun(X,Y) -> X + Y end, L(), tl(L())).
fibs(N) -> take(N, fib()).
ฉันรู้ว่า fib/1 ควรมีลักษณะเช่นนี้ (ฉันค่อนข้างแน่ใจ - แก้ไขฉันด้วยหากฉันเข้าใจผิด) การรับรายการเองและรายการที่ไม่มีหัว ดังนั้นในกรณีของ [0,1,...] zipWith(add,[0,1,...],[1,...]) ให้ผลลัพธ์ในการบวกตัวเลขสองตัวสุดท้าย แต่สิ่งที่ฉันพยายามเป็นจุดเริ่มต้นของ fib()->... ส่งผลให้เกิดข้อผิดพลาด ฉันอยากจะแสดงมันแบบนี้: fib() -> fib([[0,1] ++ fun() -> ... end]...)
ฉันต้องการเริ่ม fib/1 ด้วย [0,1,fun()...] แต่ไม่รู้ว่าจะเริ่มรายการอย่างไร
ขอบคุณล่วงหน้าสำหรับคำแนะนำครับ