Functional programming Elm函数类型:信号(列表a)->;列表(信号a)

Functional programming Elm函数类型:信号(列表a)->;列表(信号a),functional-programming,elm,Functional Programming,Elm,我是elm和函数式编程的新手。但我使用的是elm,我真的需要一个函数,它有一个信号(列表字符串)作为输入,并返回列表(信号字符串) 我知道在我的程序中,如果有一个更好的架构设计,我可能不应该有这个问题,但是有一个功能可以做到这一点,这将为我解决一个大问题 联合收割机功能的作用正好相反: combine : List (Signal a) -> Signal (List a) combine = List.foldr (map2 (::)) (constant []) 我尝试过做一些类似于

我是elm和函数式编程的新手。但我使用的是elm,我真的需要一个函数,它有一个信号(列表字符串)作为输入,并返回列表(信号字符串)

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

联合收割机功能的作用正好相反:

combine : List (Signal a) -> Signal (List a)
combine = List.foldr (map2 (::)) (constant [])
我尝试过做一些类似于联合收割机功能的事情,但到目前为止都没有成功。关于如何创建这样的功能有什么想法吗

这在一般情况下是不可能的
合并
的逆操作(通常)是不可能的。
当您有一个静态大小的信号列表时,您可以
将它们组合成一个静态大小列表的信号。但如果换一种方式,则无法保证信号中的列表是静态大小。因此,您不能“仅仅”从中构造一个列表。
(如果可以,则类型为
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)

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

谢谢@Apanatshka的回答。我知道列表需要静态大小,但因为我很固执,我想继续尝试并将取消组合函数更改为:
uncobine:Signal(list a)->list(Signal a)uncobine sig=if(Signal.map isEmpty sig)then[]else Signal.map(list.head>>不安全)sig::uncobine(n-1)(Signal.map(list.tail>>不安全)sig)
。但是我得到了类型不匹配错误,因为if子句需要Bool值,但得到了信号Bool值。这个问题有解决办法吗?没有,没有解决办法。你所尝试的是不可能的。