榆木功能的类型:信号(列表a) - >列表(信号a)

Sno*_*son 6 functional-programming elm

我是elm和函数式编程的新手.但我正在使用elm,我真的需要一个具有Signal(List String)作为输入并返回List(Signal String)的函数.

我知道我可能不应该在我的程序中使用更好的架构设计来解决这个问题,但是具有可以做到这一点的功能将为我解决一个大问题.

组合功能完全相反:

combine : List (Signal a) -> Signal (List a)
combine = List.foldr (map2 (::)) (constant [])
Run Code Online (Sandbox Code Playgroud)

我试图做类似于联合功能的事情,但迄今为止都没有成功.关于如何创建这样的功能的任何想法?

Apa*_*hka 4

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

的逆combine(通常)是不可能的。
当您有信号的静态大小列表时,您可以将combine它们转换为静态大小列表的信号。但是,当您采用其他方式时,无法保证信号中的列表是静态大小。因此,您不能“仅仅”从中构造一个列表。
(如果可以的话,类型的普通值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)
Run Code Online (Sandbox Code Playgroud)

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