【问题标题】:Continual signal switching in arrowized FRP箭头 FRP 中的连续信号切换
【发布时间】:2013-12-01 16:59:14
【问题描述】:

我一直在使用 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 的函数,并且in 本身是 fs 和 fs 本身的参数的来源。我想得到一个可以处理输入并根据这些输入动态改变其行为(构成它的信号函数)的电路。

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

【问题讨论】:

  • 在知识渊博的人出现之前,我只建议幼稚的方法:ArrowLoop 给你想要的东西吗?
  • 我可以看到如果 SF 是 ArrowApply 的一个实例会如何,但否则我不会立即看到它有什么帮助。
  • 您能否给出sf 的类型(以及两个Arrows 与&&& 的组合)?我认为这将有助于我了解发生了什么。
  • 我编辑了这个问题 - 如果还不清楚,请告诉我。

标签: haskell frp yampa


【解决方案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

这会给你想要的吗?

【讨论】:

  • 啊哈!首先,感谢您选择比我更好的类型。第二 - 我想我明白了这一点。不知何故,我没有想到将环路封闭在更大的电路上 (sf >>> (one &&& two))。但看起来你是对的。 loop $ arr swap >>> (sf >>> (one &&& two)) >>> arr swap 具有正确的类型,并且所有内容都经过类型检查。我几乎可以肯定这完美地回答了这个问题,但请再给我几分钟时间来确定。
  • 太棒了!如果您有任何问题,请回来提出更多问题。
【解决方案2】:

您要求将箭头输出的箭头用作箭头。 这就是来自ArrowApplyapp 的用途。

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

appthis answer 中有相当长的解释,但我将复制主要的相关部分:


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

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

我更喜欢使用ma,因为m 感觉更像是一种计算,而a 感觉就像一个值。有些人喜欢使用类型运算符(中缀类型构造函数),所以你得到 ​​p>

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 不可用的地方可用。

【讨论】:

  • SF 不是,也不能真正成为 ArrowApply 的实例。
猜你喜欢
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多