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

时间:2015-04-22 17:35:47

标签: functional-programming elm

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

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

组合功能正好相反:

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

我试图做类似于联合功能的事情,但到目前为止还没有成功。关于如何创建这样的功能的任何想法?

1 个答案:

答案 0 :(得分:4)

这通常是不可能的

combine的倒数(通常)不可能 当您有一个静态大小的信号列表时,您可以combine将它们转换为静态大小列表的信号。但是当你走另一条路时,无法保证信号中的列表是静态大小。因此,你不能“只是”从中构建一个列表 (如果可以的话,List类型的正常值可能会改变大小,而不会在类型周围显示Signal,并且您将动态创建和销毁列表中的信号。这是榆树不允许的两件事。)

但有一些限制......

当然,如果知道信号中的列表是静态大小,你可以根据这个假设编写一个特定的函数;如果出现静态大小列表的假设是错误的话,该函数将在运行时失败。

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邮件列表上讨论了一次,但我再也找不到了)