M
Size: a a a
M
M
ED
G
>>=
(а ещё лучше - сразу реализовать для него монаду) и исполнителя этого типа. Аппликация операторов >>=
(возможно, при помощи do-нотации) - есть eDSL, а исполнитель - есть исполнитель, интерпретатор, этого eDSL:module Main
%default total
data ReplCommand : Type -> Type where
PrintMessage : String -> ReplCommand ()
ReadMessage : ReplCommand String
(>>=) : ReplCommand a -> (a -> ReplCommand b) -> ReplCommand b
run : (command : ReplCommand resultType) -> IO resultType
run (PrintMessage x) = putStrLn x
run ReadMessage = getLine
run (x >>= f) =
do
firstResult <- run x
secondResult <- run (f firstResult)
pure secondResult
myRepl : ReplCommand ()
myRepl =
do
userInput <- ReadMessage
PrintMessage userInput
main : IO ()
main = run myRepl
ReplCommand
. Она не может совершить вредоносных действий, например, удаление БД, выход из программы, и так далее. Единственное, на чём нужно сконцентрировать внимание - это функция run
. Но она лишь одна, зато все реализации считаются "правильными" в нашей понятийной системе.uユ
uユ
return std::shared_ptr<BaseShader>(new T);
uユ
𝐦
uユ
uユ
G
uユ
ED
G
G
A -> A
являются моноидами, а множество функций A -> A
(Hom(A, A)
) в заданной категории образуют моноид с единичным элементом - id
, а бинарным оператором - композицией морфизмовG
ED
A -> A
являются моноидами, а множество функций A -> A
(Hom(A, A)
) в заданной категории образуют моноид с единичным элементом - id
, а бинарным оператором - композицией морфизмовG
A
и со-доменом A
G
A
- объект в категорииG