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 и со-доменом AG
A - объект в категорииG