箭头化FRP中的连续信号切换

时间:2013-11-18 13:56:06

标签: haskell frp yampa

我一直在玩Haskell中的Arrowized FRP库(尤其是Yampa),但我无法弄清楚如何进行“持续”切换。我的意思是信号通过信号函数(下面sf),信号函数本身就是一个信号(如图中上半部分所示)。

Continual switching

由于我事先并不知道交换机的参数是什么,所以我看不出如何将其减少为更简单的二进制交换机。

如果有可能的话,应该如何做呢?我更喜欢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)

代替。

  • 2 out 几乎无关紧要。

我的想法是,我希望电路的行为好像 sfapp,标有f的信号表示应用于的函数inin本身是f s和f s本身的参数的来源。我希望得到一个可以处理输入并根据这些输入动态改变其行为(构成它的信号函数)的电路。

一方面,我觉得sf实际上不能app,因为在这种情况下我们没有ArrowApply;但另一方面,我想通过某种形式的复杂切换可以实现相同的行为。

2 个答案:

答案 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

这会给你你想要的吗?