Elm 从列表中创建一个信号

Elm 从列表中创建一个信号,elm,elm-signal,Elm,Elm Signal,是否可以从列表创建信号?基本上我想要的是带有签名的东西列表a->Signal a。我知道,信号表示一个时变值,因此类似这样的东西实际上没有任何意义(即,我想不出在生产代码中使用它的理由) 不过,我可以看到它在测试中的应用。例如,假设某个函数依赖于信号的过去值(例如,通过),并且您希望在给定信号已接收到值x、y和z的情况下对系统的状态做出断言 请注意,信号表示它只会接收固定数量的值,不必有任何特殊之处。我认为它更像是:在生产中,你有一个鼠标点击的信号,你想从一个给定的起始位置测试它,在一组给定的点

是否可以从
列表
创建
信号
?基本上我想要的是带有签名的东西
列表a->Signal a
。我知道,
信号
表示一个时变值,因此类似这样的东西实际上没有任何意义(即,我想不出在生产代码中使用它的理由)

不过,我可以看到它在测试中的应用。例如,假设某个函数依赖于
信号的过去值(例如,通过),并且您希望在给定信号已接收到值x、y和z的情况下对系统的状态做出断言


请注意,
信号
表示它只会接收固定数量的值,不必有任何特殊之处。我认为它更像是:在生产中,你有一个鼠标点击的
信号,你想从一个给定的起始位置测试它,在一组给定的点击之后,系统应该处于其他一些已知的状态。我知道你可以通过调用固定次数的函数并将结果反馈给新的值来模拟它,我只是想知道这是否可能。

我想这是可能的。使用基于时间的信号,并将列表中的值映射到该信号上:

import Time
import Graphics.Element exposing (show)

list = [1..10]


signalFromList : List a -> Signal a
signalFromList list =
  let
    (Just h) =
      List.head list

    time =
      Time.every Time.second

    maybeFlatMap =
      flip Maybe.andThen

    lists =
      Signal.foldp (always <| maybeFlatMap List.tail) (Just list) time
  in
    Signal.filterMap (maybeFlatMap List.head) h lists

main = Signal.map show <| signalFromList list
导入时间
导入图形。元素公开(显示)
列表=[1..10]
signalFromList:列表a->Signal a
信号源列表=
让
(仅h)=
总名单
时间=
时间,每一次,每一秒
Maybefflatmap=
也许吧。然后呢
列表=

Signal.foldp(总是我不认为有任何方法可以在纯elm中同步完成(Apanatshka的回答很好地说明了如何跨时间设置一系列事件,以及为什么这是一个坏主意)。如果我们看看大多数信号是如何定义的,我们会看到它们在某个时候都会进入本机包

然后问题就变成了:我们能在本地做到这一点吗

我经常认为(信号a)是“随时间变化的a”。这里我们提供了a的列表,并希望函数使其随时间变化

在进一步讨论之前,我建议您快速浏览一下Native/Signal.js:

假设我们带着我们的as列表回到本土。我们想要一些类似于Signal.constant的东西,但有一些额外的行为会在之后“发送”每个a。但是我们什么时候可以发送呢?我猜我们不能在信号构建功能期间发送,因为我们仍在构建信号图。这给我们留下了一些其他问题选项:

  • setTimeout是一个令人发指的东西,它将每个“a”的发送安排在未来的适当时间点
  • 在elm运行时中设计一个钩子,以便在完全构建信号图时运行任意回调
至少对我来说,前者听起来容易出错,我希望后者不存在(而且永远不会存在)


对于测试,您建议使用列表折叠来模拟foldp的行为,我会这样做。

heh,是的,这两个选项听起来都很糟糕。并不是说我的
signalFromList
好得多,因为在清空列表后,您会被这个时间信号毫无理由地滴答作响所困扰。
f : List a -> Signal a