ฟังก์ชัน combinations
ของคุณได้สร้างรายการความยาว n
ที่มีการเรียงสับเปลี่ยนที่เป็นไปได้ทั้งหมดเป็น True
และ False
แล้ว คุณ ไม่ จำเป็นต้องใช้ concat
; ผลลัพธ์ที่ได้รวมรายการที่เป็นไปได้ทั้งหมดไปยังฟังก์ชันของคุณแล้ว เป็นกรณีนี้เนื่องจากฟังก์ชันที่คุณกำลังตรวจสอบคาดว่าจะมีรายการอยู่แล้ว (อยู่ในรูปแบบ \[a,b,c...]
)
นั่นคือ สำหรับ fn
การรับรายการความยาว 3 combinations 3
จะเป็น:
[[True,True,True],[True,True,False],[True,False,True],[True,False,False],
[False,True,True],[False,True,False],[False,False,True],[False,False,False]]
แต่ละองค์ประกอบของรายการนี้คือ รายการ; คุณสามารถส่งผ่านไปยังฟังก์ชันที่คุณกำลังตรวจสอบ (อันที่อาจเป็นเรื่องซ้ำซาก) ได้โดยตรง จากรายการข้างต้น สิ่งที่คุณต้องทำคือลองใช้แต่ละองค์ประกอบ
แก้ไข (พยายามชี้แจงเล็กน้อย):
คุณต้องการฟังก์ชัน taut
ที่รับฟังก์ชัน อีก ประเภท [Bool] -> Bool
และกำหนดว่าฟังก์ชันนั้นเป็นฟังก์ชันซ้ำซ้อนหรือไม่ ซึ่งหมายความว่า taut
จะมีประเภทเช่น Int -> ([Bool] -> Bool) -> Bool
สมมติว่าคุณเริ่มต้นเช่นนี้:
taut :: Int -> ([Bool] -> Bool) -> Bool
taut n fn = ...
ตอนนี้ n
คือความยาว และ fn
คือฟังก์ชัน ฟังก์ชัน combinations
ของคุณรับ n
และส่งคืน อินพุต ที่ถูกต้องทุกรายการที่เป็นไปได้เป็น fn
โปรดทราบว่า fn
คาดหวัง [Bool]
และ combinations n
ก็คือ [[Bool]]
ซึ่งหมายความว่าแต่ละองค์ประกอบสามารถเป็นอินพุตของ fn
ได้ เมื่อรู้สิ่งนี้แล้ว สิ่งที่คุณต้องทำคือใช้ fn
กับแต่ละองค์ประกอบของ combinations n
และดูว่าผลลัพธ์จะเหมือนเดิมหรือไม่
ในฟังก์ชัน taut
ของคุณ คุณไม่ต้องกังวลว่าตัวแปรภายในฟังก์ชันที่กำลังทดสอบจะได้รับมอบหมายอย่างไร เมื่อคุณเขียนฟังก์ชันนั้นจริงๆ ถ้ามันอยู่ในรูปของ \[x,y,z]->...
, x
, y
และ z
จะถูกกำหนดให้อยู่ภายในฟังก์ชันนั้นด้วยการจับคู่รูปแบบ
person
Tikhon Jelvis
schedule
11.12.2011