سؤال

فكرة أن المعيار 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')

ثم استخدم Arrowproc-notation مع بلدي Arrow الفصل ، ولكن هذا فشل كما في المثال أعلاه من التعويض و Monad.

سأستخدم في الغالب Either كمؤسس نوع الزوج وليس (,) اكتب مُنشئًا كما هو الحال مع التيار Arrow صف دراسي. قد يسمح هذا بعمل رمز لعبة لعبة RTS الخاصة بي (cabal install DefendTheKind) أجمل الكثير.

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

المحلول

تحتاج إلى استخدام تمديد noimplicitprelude للبناء الكامل القابل للروح ، بما في ذلك do و proc. في هذه الحالة ، تحصل على ما يلي ، من بين أشياء أخرى:

تتم ترجمة تدوين "do" باستخدام أي وظائف (>> =) ، (>>) ، والفشل ، في نطاق (وليس الإصدارات المسبقة). لا تتأثر اختصارات القائمة ، MDO (القسم 7.3.6 ، "التثبيت المتكرر") ، وشموح الصفيف الموازي.

يمكنك أيضًا تعديل بعض التعامل مع النفي والمساواة والقيم الحرفية وما إلى ذلك. طريقة رائعة لمحاكمة الكود!

ملاحظة - إذا كنت ستنظر إلى do بناء الجملة، ما يسميه SIGFPE "الأحاديات المعلمة" متعة كبيرة. نفس الفكرة متوفرة في category-extras تحت control.monad.indexed. ونعم ، إنهم يعملون مع بناء الجملة القابل للروح ، على الرغم من توقيعات النوع المختلفة بشكل كبير!

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