Недавно я сдал экзамен, в основном из-за вопроса EDSL. Я не понял этих концепций, поэтому я думаю, почему я потерпел неудачу. Я думаю, что объяснение моих учителей было абстрактным для меня, поэтому я задаюсь вопросом, может ли кто-нибудь объяснить это более четко.Примитивные производные операции и комбинаторы в EDSL: s
Интересно, может ли кто-нибудь кратко объяснить, что такое компоненты EDSL, и что их характеризует. В нашем курсе мы прошли через мелкое и глубокое Погружение в DSL и посмотрели на следующие строительные блоках для DSL:
- Конструкторов
- Комбинаторов (примитивный и производных)
- Run функции
Я думаю, что функции конструктора и запуска более понятны, поэтому мне больше интересно понять, что делает комбинатор производным или примитивным. Это не больно, если кто-то объяснит другие понятия. Вот пример из наших лекций для справки. Ее неглубокий из реализации внешних DSL для создания сигналов:
module Signal.Shallow
(Time
-- | the 'Signal' type is abstract
, Signal
-- * Smart constructors
, constS, timeS
-- * Combinators
, ($$), mapT
-- * Derived operation
, mapS
-- * Run function
, sample
) where
-- * Smart constructors
constS :: a -> Signal a
timeS :: Signal Time
-- * Combinators
($$) :: Signal (a -> b) -> Signal a -> Signal b
mapT :: (Time -> Time) -> Signal a -> Signal a
-- * Derived operation
mapS :: (a -> b) -> Signal a -> Signal b
-- * Run function
sample :: Signal a -> Time -> a
type Time = Double
newtype Signal a = Sig {unSig :: Time -> a}
-- | The constant signal.
constS x = Sig (const x)
-- | The time signal
timeS = Sig id
-- | Function application lifted to signals.
fs $$ xs = Sig (\t -> unSig fs t (unSig xs t))
Отличное объяснение. Благодаря! – patriques