/ / Haskell monads и направя изявление - haskell, monads

Хаскел монадите и декларацията "направи" - хакел, монади

Аз съм нов за монадите и неговото използване и следната структура, използвайки декларацията за правене, ме объркаха:

pairs xs ys = do x <- xs
y <- ys
return (x, y)

Казаха ми, че това трябва да върне всички възможни двойки от x и y, които не разбирам, защото преди това бях научил, че следният код:

eval (Val n) = Just n
eval (Div x y) = do n <- eval x
m <- eval y
safediv n m

означава: изпълнение eval x, след това да запази резултата си, ако не е равен на Nothing (в противен случай връщайте нищо) като n, тогава същото за eval y, и тогава, ако и двамата не са Nothing тя ще продължи към крайната функция safediv който комбинира двата резултата (и в противен случай се връща Nothing също).

Първото използване на доктовя в тази функция обаче pairs работи съвсем различно?

Ако някой може да ми помогне по този въпрос и да обясни каква е истинската функционалност на правенето на декларация и нейната структура, тя би била много ценена!

С Най-Добри Пожелания, Skyfe.

Отговори:

5 за отговор № 1

Най- do строителни работи в който и да е monad, и там го използвате в два различни монада.

В първия случай,

pairs xs ys = do x <- xs
y <- ys
return (x, y)

Вие работите в списъка monad, т.е. [], Можете да го видите, защото използвате x <- xs и xs е от типа [something].

Във втория случай

eval (Val n) = Just n
eval (Div x y) = do n <- eval x
m <- eval y
safediv n m

работите в Maybe монада. Наистина, вие използвате y <- eval x и eval се завръща Maybe something.

Всеки монад определя собствените си правила за това <- трябва да означава. В списъка monad, той грубо означава "разгледа всички възможни елементи", в може би "вземете x в Just x, и се провалят в противен случай ".

От техническа гледна точка <- конструирайте в рамките на do се отхвърля в обаждане до >>= оператор, който всеки монах определя самостоятелно.