我最近考試不及格,主要是因爲EDSL問題。我沒有掌握這些概念,所以我認爲這就是爲什麼我失敗了。我認爲我的老師的解釋是爲了讓我理解,所以我想知道有人能更清楚地解釋它。EDSL中的原始派生操作和組合器:s
我想知道是否有人能簡單地解釋一下EDSL的組成部分是什麼,以及它們的特徵。在我們的過程中,我們通過DSL的淺,深嵌入走了,看着下面積木的DSL:
- 構造函數
- 組合程序(原始的和衍生的)
- 運行功能
我認爲構造函數和運行函數更加明瞭,所以我更有興趣瞭解是什麼使得一個Combinator派生或原始。如果有人會解釋其他概念,這並不會受到傷害。這裏是我們講座的一個例子,以供參考。它的一個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 2014-08-31 17:09:30