هل هذين منفذين متاحين بالفعل في Haskell؟
-
18-09-2019 - |
سؤال
أحتاج إلى منفذين ثنائية من النوع
(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)