类型为 Signal (List a) -> List (Signal a) 的 Elm 函数

Elm function with the type: Signal (List a) -> List (Signal a)

我对 elm 和一般的函数式编程不熟悉。但是我使用的是榆树,我真的需要一个函数,它有一个 Signal (List String) 作为输入和 returns List (Signal String).

我知道如果在我的程序中有更好的架构设计,我可能不应该遇到这个问题,但是如果有一个函数可以做到这一点,那将解决我的一个大问题。

combine 函数的作用正好相反:

combine : List (Signal a) -> Signal (List a)
combine = List.foldr (map2 (::)) (constant [])

我试过做一些类似于 combine 函数的事情,但到目前为止没有成功。关于如何创建此类功能的任何想法?

这在一般情况下是不可能的

combine 的逆运算(通常)是不可能的。
当您有一个静态大小的信号列表时,您可以 combine 将它们放入一个静态大小列表的信号中。但是当你走另一条路时,不能保证信号中的列表是静态大小。因此,您不能 "just" 从中构建列表。
(如果可以的话,类型 List 的正常值可以改变大小而不在类型周围显示 Signal ,并且您将在列表中动态创建和销毁信号。这是 Elm 不允许的两件事.)

但有一些限制...

当然,如果知道信号中的列表是静态大小的,您可以根据该假设编写特定的函数;如果发生您对静态大小列表的假设错误的情况,该函数将在运行时失败。

unsafe : Maybe a -> a
unsafeHead m =
  case m of
    Just a -> a
    Nothing -> Debug.crash "unsafe: You're out of luck. The `Maybe` was not a `Just`. "

uncombine : Int -> Signal (List a) -> List (Signal a)
uncombine n sig =
  if n == 0
    then []
    else Signal.map (List.head >> unsafe) sig
      :: uncombine (n-1) (Signal.map (List.tail >> unsafe) sig)

(我很确定这个问题曾在 elm-discuss 邮件列表中讨论过一次,但我再也找不到了)