2012-02-28 119 views
15

我正在尋找一些詞彙。有許多具有通用名稱的形狀。例如L a = Empty | Cons a L通常稱爲「列表」,而T a = Leaf a | Node (T a) (T a)是「二叉樹」,St s a :: St (s->(a,s))是State Monad的形式。類型模式的名稱:R a b = Q(a - >(R a b,b))

我想知道,如果這樣的形狀有一個名字:

data R a b = Q (a -> (R a b,b)) 

我已經看到了箭框架和狀態機實現這種模式。遞歸函數使它感覺有點像State Monad或Cont Monad。它也是除了(->)(>=>)之外的唯一結構,我已經看到了Arrow定義的一個實例。

這個數據結構有一個共同的名字嗎?

+8

你有盆景樹:)。更好的二叉樹是'T a = Branch(T a)(T a)|葉a' – amindfv 2012-02-28 20:46:38

+0

@amindfy:你是對的。我修復了它。謝謝。 – 2012-02-28 23:44:04

+1

@ JohnF.Miller你不想在'T a'的某個地方存儲一些'a'嗎? :D(對不起......我不得不...)(或者這可能是一個幻影類型!?:p) – Ptival 2012-02-28 23:54:01

回答

23

這是一個automaton arrow,也被稱爲粉碎機。您的具體示例僅使用(->)作爲底層箭頭;另一種常見選擇是某些單子的Kleisli mm(它只是將a -> b轉換爲a -> m b;例如data R a b = Q (a -> MyMonad (b, R a b)))。

它在functional reactive programming常用的(具體而言,arrowised FRP - 見,例如netwire這兩個博客文章:12),並具有應用到一般流處理(如iteratees)。

它在很多方面類似於協程,但它是一個更具體的概念。我鏈接的兩篇博文稱他們爲協程,所以「協程」當然是引用它的常用方法,但確切的名稱是一個自動機箭頭。

+1

這正是我所尋找的和更多。感謝您提供非常完整的答案。 – 2012-02-28 23:47:05

8

我會稱之爲數據結構的一個協程。

它表示可以與其他一些計算並行控制的計算,並且可以逐步進行評估。雖然您提供的接口並不是用於Haskell中Coroutines類的確切接口(更一般的Coroutine也是monad-agnostic,這意味着封裝的函數返回m (R a b, b),並且協程並不需要消耗輸入,儘管你在這裏總是需要用a來計算),但它足夠相似。

數據結構也代表了所謂的Comonads的一個子集。

3

該類型看起來與我期望用於傳感器的類型相關 - 我只希望輸出類型爲monoidal。維基百科在特定類別的傳感器上有一個頁面,finite state transducers,這應該是文獻檢索的一個很好的啓動點。

相關問題