سؤال

في بعض الأحيان أجد نفسي أبرز النمط "إذا لم يكن المنسق غير صحيح" أو "إذا لم تكن القائمة فارغة ، فاستخدمها شيئًا آخر".

أنا أبحث عن وظائف لـ Bool and List التي هي وظيفة "ربما" ربما. هل يوجد أي؟

استكمال: قصدت استخدام حالة Bool كتعميم لحالة القائمة. على سبيل المثال عند العمل مع data.text كـ t:

if T.null x then x else foo x

أنا أتطلع إلى تقليل رمز لوحة المرجل هذه.

هل كانت مفيدة؟

المحلول

أعتقد أن الإجابة هي على الأرجح أنه لا توجد وظيفة عامة. كما يقول DJV ، ربما يمكنك البناء على data.monoid لكتابة واحدة ، شيء مثل:

maybe' :: (Eq a, Monoid a) => b -> (a -> b) -> a -> b
maybe' repl f x = if x == mempty then repl else f x

لكنني لا أعرف أي وظائف في المكتبة القياسية من هذا القبيل (أو أي يمكن أن تتألف بسهولة معًا للقيام بذلك).

نصائح أخرى

ربما هو كاتارفومية من النوع ربما.

Foldr هو كاتارفومية نوع القائمة.

إذا كنت قد استخدمت ربما مثل: maybe x (const y)

يمكنك استخدام: foldr (const (const y)) x

بالنسبة إلى BOOL ، أفتقد أيضًا كاتاروامورفيمية في المكتبة القياسية ، ولكن سيكون:

bool :: a -> a -> Bool -> a
bool t _ True = t
bool _ f False = f

الشيك data.monoid, ، إنها عبارة عن مجموعة من أنواع البيانات التي لها قيمة فارغة مخصصة ويمكنك أن تتطابق معها لكتابة وظيفتك العامة. هناك حالات ل Bool ذات قيمة فارغة False ولل List ذات قيمة فارغة [].

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top