Аз съм нов за монадите и неговото използване и следната структура, използвайки декларацията за правене, ме объркаха:
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
се отхвърля в обаждане до >>=
оператор, който всеки монах определя самостоятелно.