Haskell กำลังพยายามทำให้ฟังก์ชัน foldl ของฉันทำงานได้

ฉันมีฟังก์ชันที่แปลง [a, b, c, d, . . . ] ถึง [(a,b), (c, d), . . .]. ตอนนี้ใช้งานได้แล้วและนี่คือรหัสสำหรับสิ่งนั้น:

makeTuple :: [a] -> [(a,a)]
makeTuple [] = []
makeTuple [a] = []
makeTuple (x:y:xs) = (x,y): (makeTuple xs)

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

productTuple [x] = foldl makeTuple [] [x]

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


person lou tej    schedule 02.11.2017    source แหล่งที่มา
comment
ใครบอกว่าคุณต้องใช้ฟังก์ชัน makeTuple ของคุณ?   -  person Willem Van Onsem    schedule 02.11.2017
comment
คุณอาจต้องใช้กรณีว่างและข้อเสียของ productTuple ดังนั้น productTuple (x:xs) และ productTuple []   -  person altschuler    schedule 02.11.2017
comment
คำแนะนำ: คุณจะใช้ foldl ที่ใช้เป็นรายการอินพุตเพื่อสร้างรายการนั้นขึ้นมาใหม่ได้อย่างไร (โดยพื้นฐานแล้วเป็นฟังก์ชัน id)   -  person Willem Van Onsem    schedule 02.11.2017
comment
ที่เกี่ยวข้อง: stackoverflow.com/q/26017352/67579   -  person Willem Van Onsem    schedule 02.11.2017


คำตอบ (2)


ฟังก์ชันแลมบ์ดาควรเคารพลายเซ็นนี้:

 [a] -> (b,b) -> [a]

แอคคูมูเลเตอร์มีประเภท [a] ส่วนทูเพิลมีประเภท (b,b)

คุณสามารถลองแลมบ์ดาแบบนี้ \acc (a, b) -> acc++[a*b]

ฟังก์ชั่นสุดท้ายอาจมีลักษณะดังนี้:

productTuple :: Num a => [a] -> [a]
productTuple xs = foldl (\acc (a, b) -> acc++[a*b]) [] (makeTuple xs)

คุณมีตัวอย่าง ฟังก์ชัน foldl ที่นี่

ฉันลองใช้โค้ดนี้ที่นี่

person Arno    schedule 02.11.2017

แบบฝึกหัดขอให้คุณประมวลผลรายการอินพุตล่วงหน้าด้วย makeTuple แล้วพับทับ

productTuple :: [Int] -> [Int]
productTuple xs = foldl (some lambda) something (makeTuple xs)

มันไม่ใช่วิธีที่สะดวกที่สุดในการทำ แต่ฉันเดาว่าประเด็นของแบบฝึกหัดคือการบังคับให้คุณใช้ foldl เพียงเพื่อประโยชน์เท่านั้น

person chi    schedule 02.11.2017
comment
การใช้ makeTuple ของ OP ทำให้เกิดข้อผิดพลาดประเภท: ใช้เพียงรายการเดียวเป็นอาร์กิวเมนต์ - person gallais; 02.11.2017