我一直在玩Haskell中的Arrowized FRP库(尤其是Yampa),但我无法弄清楚如何进行“持续”切换。我的意思是信号通过信号函数(下面sf
),信号函数本身就是一个信号(如图中上半部分所示)。
由于我事先并不知道交换机的参数是什么,所以我看不出如何将其减少为更简单的二进制交换机。
如果有可能的话,应该如何做呢?我更喜欢Yampa代码,但对任何Arrowized FRP代码都很满意。我没有尝试过其他图书馆(例如Sodium或Reactive Banana)知道在这些情况下我是否也有同样的困惑,但我也对它们感到好奇。
修改
为了使这个更清晰,更具体,我已经标记了图像;标签的可能类型是:
: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
s本身的参数的来源。我希望得到一个可以处理输入并根据这些输入动态改变其行为(构成它的信号函数)的电路。
一方面,我觉得sf
实际上不能app
,因为在这种情况下我们没有ArrowApply
;但另一方面,我想通过某种形式的复杂切换可以实现相同的行为。
答案 0 :(得分:2)
您要求箭头输出箭头以用作箭头。
这就是app
ArrowApply
的用途。
如果你想在你的图表之类的循环结构中使用它,你可能需要ArrowLoop,但实际上do
表示法允许你对所有这些东西都相当灵活。
对this answer中的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
不可用的地方。
答案 1 :(得分:1)
我仍然认为这是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
(或loop
arr swap
明智地放置)来获得Arr A C
。
这会给你你想要的吗?