2

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

连续切换

由于我不提前知道开关的参数是什么,所以我看不出如何将其简化为更简单的二进制开关。

如果可能的话,应该怎么做呢?我更喜欢 Yampa 代码,但对任何带箭头的 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)

反而。

  • 2out几乎无关紧要。

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

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

4

2 回答 2

2

您要求有一个由箭头输出的箭头用作箭头。这就是appfromArrowApply的用途。

如果你想在像你的图表这样的循环结构中使用它,你可能需要 ArrowLoop,但实际上这个do符号允许你对所有这些东西相当灵活。

app这个答案中有很长的解释,但我会复制主要的相关位:


应用究竟是做什么的?它的类型甚至没有 (->)它允许您将箭头的输出用作箭头。让我们看看类型。

app :: ArrowApply m => m (m b c, b) c

我更喜欢使用mto,a因为m感觉更像是一种计算并且a感觉像是一种价值。有些人喜欢使用类型运算符(中缀类型构造函数),所以你得到

app :: ArrowApply (~>) => (b ~> c, b) ~> c

我们认为b ~> c是一个箭头,我们认为箭头是一个接受bs、做某事并给出cs 的事物。所以这意味着app一个箭头,它接受一个箭头和一个值,并且可以产生第一个箭头在该输入上产生的值。

它在类型签名中没有->,因为在使用箭头编程时,我们可以使用 将任何函数转换为箭头arr :: Arrow (~>) => (b -> c) -> b ~> c,但您不能将每个箭头都转换为函数,因此在哪里都(b ~> c, b) ~> c可以使用,(b ~> c, b) -> c(b -> c, b) ~> c可以不在。

于 2013-11-18T18:55:48.130 回答
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(或者更确切地说looparr swap明智地放置)来获得一个Arr A C.

那会给你你想要的吗?

于 2013-11-20T22:29:13.957 回答