"तीर" पैकेज में Control.Arrow.Transformer.Automaton मॉड्यूल देखें।यह प्रकार
newtype Automaton a b c = Automaton (a b (c, Automaton a b c))
यह थोड़ा उलझन में है क्योंकि यह एक तीर ट्रांसफार्मर है। सबसे सरल मामले में आप
type Auto = Automaton (->)
जो अंतर्निहित तीर के रूप में कार्य करता है। स्थानापन्न (->) के लिए "एक" Automaton परिभाषा और इन्फ़िक्स अंकन का उपयोग आप देख सकते हैं इस मोटे तौर पर के बराबर है:
newtype Auto b c = Automaton (b -> (c, Auto b c))
दूसरे शब्दों में एक automaton एक समारोह है कि एक इनपुट लेता है और एक परिणाम देता है और है एक नया automaton।
आप प्रत्येक राज्य के लिए एक फ़ंक्शन लिखकर सीधे इसका उपयोग कर सकते हैं जो तर्क लेता है और परिणाम और अगला कार्य देता है। उदाहरण के लिए, रेगेक्सपी "ए + बी" (यानी, कम से कम एक 'ए' की श्रृंखला 'बी' के बाद पहचानने के लिए एक राज्य मशीन है। (नोट: अपरीक्षित कोड)
state1, state2 :: Auto Char Bool
state1 c = if c == 'a' then (False, state2) else (False, state1)
state2 c = case c of
'a' -> (False, state2)
'b' -> (True, state1)
otherwise -> (False, state1)
अपने मूल प्रश्न, क्यू = {state1, state2}, एक्स = चार के संदर्भ में, डेल्टा समारोह अनुप्रयोग है, और एफ एक की तुलना में लौटने यह सच है (न कि राज्य संक्रमण है "राज्य स्वीकार करना" मैंने एक स्वीकार्य मूल्य के साथ एक आउटपुट संक्रमण का उपयोग किया है)।
वैकल्पिक रूप से आप तीर नोटेशन का उपयोग कर सकते हैं। Automaton लूप और सर्किट समेत सभी रोचक तीर कक्षाओं का एक उदाहरण है, ताकि आप देरी का उपयोग करके पिछले मानों तक पहुंच प्राप्त कर सकें। (नोट: फिर, अपरीक्षित कोड)
recognise :: Auto Char Bool
recognise = proc c -> do
prev <- delay 'x' -< c -- Doesn't matter what 'x' is, as long as its not 'a'.
returnA -< (prev == 'a' && c == 'b')
"देरी" तीर का मतलब है कि "पिछला" वर्तमान मान "सी" के पिछले मूल्य के बजाय के बराबर है। आप "आरईसी" का उपयोग कर अपने पिछले आउटपुट तक पहुंच भी प्राप्त कर सकते हैं। उदाहरण के लिए, यहां एक तीर है जो आपको समय के साथ एक क्षीण कुल देता है। (वास्तव में इस मामले में जांच की)
-- | Inputs are accumulated, but decay over time. Input is a (time, value) pair.
-- Output is a pair consisting
-- of the previous output decayed, and the current output.
decay :: (ArrowCircuit a) => NominalDiffTime -> a (UTCTime, Double) (Double, Double)
decay tau = proc (t2,v2) -> do
rec
(t1, v1) <- delay (t0, 0) -< (t2, v)
let
dt = fromRational $ toRational $ diffUTCTime t2 t1
v1a = v1 * exp (negate dt/tau1)
v = v1a + v2
returnA -< (v1a, v)
where
t0 = UTCTime (ModifiedJulianDay 0) (secondsToDiffTime 0)
tau1 = fromRational $ toRational tau
नोट कैसे "देरी" के लिए इनपुट "वी", इसके उत्पादन से प्राप्त एक मूल्य भी शामिल है। "आरईसी" खंड इसे सक्षम बनाता है, इसलिए हम एक फीडबैक लूप बना सकते हैं।
एक नियतात्मक automaton के मामले में, डेल्टा प्रकार क्यू की हो सकता है -> एक्स -> एक्स - -> क्यू एक गैर नियतात्मक automaton के मामले में, मुझे क्यू की तरह कुछ का चयन करेंगे> [क्यू] –
क्या स्वेन हैगर कहते हैं, और 'एफ' को 'आईएसईंड :: क्यू -> बूल' –