هل الإجراء الخاص بـ "قاعدة: ghc.base.monad"؟
سؤال
فكرة أن المعيار Monad
الفصل معيب ويجب أن يمتد بالفعل Functor
أو Pointed
يطفو حولها.
أنا لا أدعي بالضرورة أن هذا هو الشيء الصحيح الذي يجب القيام به ، لكن لنفترض أن المرء كان يحاول القيام بذلك:
import Prelude hiding (Monad(..))
class Functor m => Monad m where
return :: a -> m a
join :: m (m a) -> m a
join = (>>= id)
(>>=) :: m a -> (a -> m b) -> m b
a >>= t = join (fmap t a)
(>>) :: m a -> m b -> m b
a >> b = a >>= const b
حتى الآن جيد جدًا ، ولكن بعد ذلك عند محاولة استخدام عملية التعويض:
whileM :: Monad m => m Bool -> m ()
whileM iteration = do
done <- iteration
if done
then return ()
else whileM iteration
يشكو المترجم:
Could not deduce (base:GHC.Base.Monad m) from the context (Monad m)
سؤال:
هل يعمل التعويض فقط ل base:GHC.Base.Monad
؟ هل هناك طريقة لجعلها تعمل مع بديل Monad
صف دراسي؟
سياق إضافي:
ما أريد فعله حقًا هو استبدال base:Control.Arrow.Arrow
مع "معمم" Arrow
صف دراسي:
{-# LANGUAGE TypeFamilies #-}
class Category a => Arrow a where
type Pair a :: * -> * -> *
arr :: (b -> c) -> a b c
first :: a b c -> a (Pair a b d) (Pair a c d)
second :: a b c -> a (Pair a d b) (Pair a d c)
(***) :: a b c -> a b' c' -> a (Pair a b b') (Pair a c c')
(&&&) :: a b c -> a b c' -> a b (Pair a c c')
ثم استخدم Arrow
proc-notation مع بلدي Arrow
الفصل ، ولكن هذا فشل كما في المثال أعلاه من التعويض و Monad
.
سأستخدم في الغالب Either
كمؤسس نوع الزوج وليس (,)
اكتب مُنشئًا كما هو الحال مع التيار Arrow
صف دراسي. قد يسمح هذا بعمل رمز لعبة لعبة RTS الخاصة بي (cabal install DefendTheKind
) أجمل الكثير.
المحلول
تحتاج إلى استخدام تمديد noimplicitprelude للبناء الكامل القابل للروح ، بما في ذلك do
و proc
. في هذه الحالة ، تحصل على ما يلي ، من بين أشياء أخرى:
تتم ترجمة تدوين "do" باستخدام أي وظائف (>> =) ، (>>) ، والفشل ، في نطاق (وليس الإصدارات المسبقة). لا تتأثر اختصارات القائمة ، MDO (القسم 7.3.6 ، "التثبيت المتكرر") ، وشموح الصفيف الموازي.
يمكنك أيضًا تعديل بعض التعامل مع النفي والمساواة والقيم الحرفية وما إلى ذلك. طريقة رائعة لمحاكمة الكود!
ملاحظة - إذا كنت ستنظر إلى do
بناء الجملة، ما يسميه SIGFPE "الأحاديات المعلمة" متعة كبيرة. نفس الفكرة متوفرة في category-extras
تحت control.monad.indexed. ونعم ، إنهم يعملون مع بناء الجملة القابل للروح ، على الرغم من توقيعات النوع المختلفة بشكل كبير!