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, do
bloklarda 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 -> False
ya da adlandırılmış bir işlev la yazıyorum let myPred (MyCons _) = True; myPred _ = False in
ama ikisi de çok çirkin görünüyor ve çok deyimsel değil. "Açık" (ve yanlış) yol böyle bir şey olurdu, \(MyCons _) -> True
ancak 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 -> b
ve bool :: a -> a -> Bool -> a
daha 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.
let
sevmediğiniz maddeden oldukça memnun olurum - eşdeğerwhere
maddeyi 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.