ฉันกำลังจัดการกับฟังก์ชั่นที่จะเป็นดังนี้:
foo = (\(a:b:c:d:e:f:_) -> foobar a b c d e f) . (++ repeat def)
กล่าวอีกนัยหนึ่งเมื่อได้รับรายการจะใช้องค์ประกอบหกรายการแรกสำหรับบางสิ่งและหากรายการมีความยาวน้อยกว่าหกองค์ประกอบรายการนั้นจะใช้def
เป็นรายการสแตนด์บายสำหรับรายการที่หายไป นี่คือทั้งหมด แต่ชิ้นส่วนของมันไม่ได้ (เหมือนmap fromJust . filter isJust
) ดังนั้นฉันจึงไม่ชอบ ฉันพยายามเขียนใหม่เพื่อที่ว่ามันไม่จำเป็นต้องใช้ความลำเอียงและได้สิ่งนี้:
foo [] = foobar def def def def def def
foo [a] = foobar a def def def def def
foo [a,b] = foobar a b def def def def
foo [a,b,c] = foobar a b c def def def
foo [a,b,c,d] = foobar a b c d def def
foo [a,b,c,d,e] = foobar a b c d e def
foo (a:b:c:d:e:f:_) = foobar a b c d e f
ฉันทำสิ่งที่ฉันต้องการในทางเทคนิคแล้ว แต่ตอนนี้มันเป็นเรื่องใหญ่โต ฉันจะทำสิ่งนี้อย่างสง่างามและซ้ำซากน้อยลงได้อย่างไร
case xs ++ repeat def of a:b:c:d:e:f:_ -> ...
ท้องถิ่นนั้นเพียงพอที่ฉันจะไม่คิดสองครั้งเกี่ยวกับการใช้มันและข้ามกลไกพิเศษทั้งหมดที่คำตอบที่มีอยู่กำลังเปิดตัว โดยทั่วไปแล้วมันคือข้อโต้แย้งจำนวนทั้งสิ้นทั่วโลก (ซึ่งเกี่ยวข้องกับค่าคงที่ที่เก็บรักษาไว้ในการเรียกใช้ฟังก์ชันหลายครั้ง) ที่ทำให้ฉันรู้สึกประหม่า
takeWithDef
ไม่สามารถใช้งานได้ถ้ามันส่งกลับรายการปกติเนื่องจากเราต้องจัดรูปแบบที่ตรงกับที่: - / ทางออกที่เหมาะสมคือสิ่งที่แดเนียลเขียนไว้ด้านล่างในคำตอบที่สองของเขา uncons
รับเฉพาะองค์ประกอบแรกเท่านั้นดังนั้นจึงไม่มีประโยชน์
uncons :: Default a => [a] -> (a,[a])
หรือผิดนัดdef
takeWithDef
และ / หรือรูปแบบคำพ้อง / รูปแบบการดู แม้ว่าจะต้องมีการเขียนรหัสผู้ช่วยเสริมบ้าง