Şu anda böyle bir fonksiyonla uğraşıyorum:
foo = (\(a:b:c:d:e:f:_) -> foobar a b c d e f) . (++ repeat def)
Başka bir deyişle, bir liste verildiğinde, bir şey için ilk altı öğeyi kullanır ve liste altı öğeden daha kısasa def
, eksik olanlar için bir stand-in olarak kullanır . Bu toplam, ama parçaları (tıpkı gibi map fromJust . filter isJust
) değil, bu yüzden sevmiyorum. Herhangi bir kısmi kullanmak gerekmez, bu yeniden yazmaya çalıştım ve var:
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
Teknik olarak istediğimi yaptım, ama şimdi bu devasa bir karmaşa. Bunu nasıl daha zarif ve daha az tekrarlayıcı bir şekilde yapabilirim?
case xs ++ repeat def of a:b:c:d:e:f:_ -> ...
, sadece iki kez kullanmak ve mevcut cevapların getirdiği tüm ekstra makineleri atlamak hakkında düşünmeyeceğim kadar yerel. Genellikle beni daha çok sinirlendiren (örneğin, birden fazla işlev çağrısında tutulan değişmezleri içeren) daha küresel bütünlük argümanlarıdır.
takeWithDef
normal bir liste döndürürse kullanılamaz, çünkü bunu eşleştirmemiz gerekir: - / Uygun çözüm Daniel'in ikinci cevabında aşağıda yazdığı şeydir. uncons
sadece ilk elementi alır, bu yüzden o kadar kullanışlı değil.
uncons :: Default a => [a] -> (a,[a])
varsayılan olarak bir tane yazındef
. Ya da bir temerrüttakeWithDef
. Ve / veya bir görünüm modeli / kalıp eşanlamı. Bununla birlikte, bazı yardımcı yardımcı kodları yazmayı gerektirir.