[英]Continual signal switching in arrowized FRP
我一直在玩Haskell(尤其是Yampa)中的Arrowized FRP庫,但是我不太清楚如何進行“連續”切換。 我的意思是,信號通過信號函數(下面的sf
)本身就是一個信號(如圖像的上半部分所示)。
由於我不提前知道開關的參數,所以我看不到如何將其簡化為更簡單的二進制開關。
如果有可能的話,該怎么辦? 我希望使用Yampa代碼,但對任何Arrowized FRP代碼都滿意。 我沒有嘗試過其他庫(例如,鈉或反應性香蕉)來了解在這些情況下是否會有同樣的困惑,但是我也對此感到很好奇。
編輯
為了使這一點更加具體,我對圖像進行了標記。 標簽的可能類型為:
in :兩個Either Int (Int -> Int)
1 :( (Int -> Int) -> (Either Int (Int -> Int) -> (Int -> Int))
sf 可能是:
(Either Int (Int -> Int) -> (Int -> Int)) -> Either Int (Int -> Int) -> (Int -> Int)
(例如, app
)。 但這僅在帶有問號的部分代表sf
的輸入時。 如果它表示更復雜的開關,則類型為
(Either Int (Int -> Int) -> (Int -> Int)) -> (Int -> Int)
代替。
這個想法是,我想要的電路表現得好像 sf
是app
,用標記信號f
表示被施加到函數in
,並用in
本身為的雙方的觀點到源f
s,並且f
š本身。 我想要一個可以處理輸入並根據這些輸入動態更改其行為(構成它的信號功能)的電路。
一方面,在我看來sf
實際上不能成為app
,因為在這種情況下,我們沒有ArrowApply
; 但另一方面,我認為通過某種形式的復雜切換可以實現相同的行為。
您要求有一個由箭頭輸出的箭頭用作箭頭。 這就是ArrowApply
的app
的ArrowApply
。
如果要在諸如圖表之類的循環結構中使用它,則可能需要ArrowLoop,但實際上do
表示法使您無論如何都可以相當靈活。
在這個答案中有一個關於app
的冗長解釋,但是我將復制主要的相關部分:
應用程式到底能做什么? 它的類型甚至沒有(->)。它使您可以將箭頭的輸出用作箭頭。 讓我們看一下類型。
app :: ArrowApply m => m (m b c, b) c
我喜歡用m
來a
,因為m
感覺更像是一個計算和a
感覺就像一個值。 有些人喜歡使用類型運算符(中綴類型構造函數),因此您得到
app :: ArrowApply (~>) => (b ~> c, b) ~> c
我們將b ~> c
視為一個箭頭,並且將箭頭視為一個包含b
s,做某事並給出c
s的事物。 因此,這意味着app
是一個帶有箭頭和值的箭頭,並且可以產生第一個箭頭在該輸入上將產生的值。
它在類型簽名中沒有->
,因為使用箭頭編程時,我們可以使用arr :: Arrow (~>) => (b -> c) -> b ~> c
將任何函數變成箭頭。您不能將每個箭頭都變成一個函數,因此(b ~> c, b) ~> c
可用,其中(b ~> c, b) -> c
或(b -> c, b) ~> c
不可以。
我仍然認為這是ArrowLoop
的情況!
你有
in :: Arr () A
sf :: Arr (A -> B, A) B
one :: Arr B (A -> B)
two :: Arr B C
sf
只是arr (uncurry ($))
。
然后,您有了sf >>> (one &&& two) :: Arr (A -> B, A) (A -> B, C)
然后可以使用loop
(或明智地放置帶有arr swap
loop
)來獲取Arr AC
那會給你你想要的嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.