Son zamanlarda, bir yüklem işlevini başka bir işleve geçirmem gereken durumlarda çalışıyorum ve sık sık aradığım mantık aslında "bu değer bu modelle eşleşiyor mu?"
Desen eşleştirme, bildirimlerde, dobloklarda ve liste kavrayışlarında tercih edilir gibi görünür , ancak bir a -> Boolşekilde bir desende geçmenin çok kullanışlı olacağı bir yüklem alan bir dizi işlev vardır . Örneğin takeWhile, until, find, span, vs.
Şimdiye kadar yapıyorum \a -> case a of MyCons _ -> True; otherwise -> Falseya da adlandırılmış bir işlev la yazıyorum let myPred (MyCons _) = True; myPred _ = False inama ikisi de çok çirkin görünüyor ve çok deyimsel değil. "Açık" (ve yanlış) yol böyle bir şey olurdu, \(MyCons _) -> Trueancak bu doğal olarak kısmi olduğu için bir hata atıyor ve o zaman bile daha temiz bir yol olmalı gibi geliyor.
Bu tür şeyleri yapmanın daha özlü / temiz bir yolu var mı? Yoksa tamamen yanlış bir şekilde mi gideceğim?
let myPred...stilin kötü olduğunu düşünüyorum bile değil , ama çok basit bir fikir beklediğimden çok daha ayrıntılı hissediyorum, bu da yanlış ağaca havlayıp havlamadığımı merak etmemi sağlıyor.
maybe :: b -> (a -> b) -> Maybe a -> bve bool :: a -> a -> Bool -> adaha sonra bunu Boolean üreten işlev (ler) ile bağımsız değişken olarak kullanmaktır. örneğin myCons z f (MyCons x) = f x ; myCons z f _ = z, arayın myCons False (const True) aMyConsValue. Bu neredeyse yazdığınız şeydir, sadece içine konulmuş işlevsel argüman (lar) aracılığıyla bir "dolaylılık" / "soyutlama" düzeyi daha vardır.
letsevmediğiniz maddeden oldukça memnun olurum - eşdeğerwheremaddeyi tercih etsem de, bu da ana tanımı karıştırmaz. Tabii ki bu yardımcı programa bir kereden fazla ihtiyaç duyuyorsanız, üst düzey bir işlev olarak tanımlayabilirsiniz.