سؤال

أحتاج إلى منفذين ثنائية من النوع

(a -> Bool) -> (a -> Bool) -> a -> Bool

أو ربما

[a -> Bool] -> a -> Bool

(على الرغم من أن هذا سيكون مجرد flitr1 من الأول، فأنا عادة ما أحتاج إلى الجمع بين وظيفتين منطقيين.)

هل هذه مدمجة؟


إذا لم يكن الأمر كذلك، فإن التنفيذ بسيط:

both f g x = f x && g x
either f g x = f x || g x

او ربما

allF fs x = foldr (\ f b -> b && f x) True fs
anyF fs x = foldr (\ f b -> b || f x) False fs

لا يمنح Hoogle أي شيء، لكن في بعض الأحيان لا يعمم البحث بشكل صحيح. أي فكرة إذا كانت هذه مدمجة؟ هل يمكن بناؤها من قطع مكتبة موجودة؟

إذا لم تكن هذه مدمجة، فقد تشير إلى أسماء جديدة لأن هذه الأسماء سيئة للغاية. في الواقع هذا هو السبب الرئيسي في أنني آمل أن نكون مدمج.

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

المحلول

Control.Monad يحدد instance Monad ((->) r), ، وبالتالي

GHCI>: M Control.Monad GHCI>: T LiftM2 (&&) Liftm2 (&&) :: (Monad M) => M Bool -> M Bool -> M Bool Ghci> Liftm2 (&&) (5 <) (<10 ) 8 صحيح

يمكنك أن تفعل الشيء نفسه مع Control.Applicative.liftA2.


لا توحي بجدية، ولكن ...

GHCI>: T (. الوجه ($)). الوجه جميع (. الوجه ($)). اقلب الكل :: [A -> Bool] -> A -> BOOL GHCI>: T (. الوجه ($)). الوجه أي (. الوجه ($)). الوجه أي :: [A -> BOOL] -> A -> BOOL

نصائح أخرى

انها ليست مدمجة، ولكن البديل الذي أفضل استخدام فئات النوع إلى تعميم العمليات المنطقية لدينات أي arity:

module Pred2 where

class Predicate a where
  complement :: a -> a
  disjoin    :: a -> a -> a
  conjoin    :: a -> a -> a

instance Predicate Bool where
  complement = not
  disjoin    = (||)
  conjoin    = (&&)

instance (Predicate b) => Predicate (a -> b) where
  complement = (complement .)
  disjoin f g x = f x `disjoin` g x
  conjoin f g x = f x `conjoin` g x


-- examples:

ge :: Ord a => a -> a -> Bool
ge = complement (<)

pos = (>0)
nonzero = pos `disjoin` (pos . negate)
zero    = complement pos `conjoin` complement (pos . negate)

أنا أحب haskell!

أنا لا أعرف الأبعاد، لكني أحب الأسماء التي تقترحها.

getCoolNumbers = filter $ either even (< 42)

بالتناوب، يمكن للمرء التفكير في رمز المشغل بالإضافة إلى typeclasses للبدائل.

getCoolNumbers = filter $ even <|> (< 42)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top