2015-04-22 67 views
6

我是榆樹和函數式編程的新手。但我使用榆樹,我真的需要一個具有信號(列表字符串)作爲輸入並返回列表(信號字符串)的函數。榆木函數的類型:信號(列表a) - >列表(信號a)

我知道我可能不應該在我的程序中有一個更好的架構設計這個問題,但有一個功能,可以做到這一點將爲我解決一個大問題。

合併功能不完全相反:

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

我試圖做類似的功能結合起來的東西,但沒有成功爲止。任何想法如何創建這樣的功能?

回答

4

這是不可能的,一般

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郵件列表上討論這個問題,但我不能再找到它)

+0

謝謝@Apanatshka的回答。我知道列表需要是靜態大小,但因爲我很固執,我想繼續嘗試並將uncombine函數更改爲: 'uncombine:Signal(List a) - > List(Signal a) uncombine sig =如果(Signal.map isEmpty sig) then [] else Signal.map(List.head >> unsafe)sig :: uncombine(n-1)(Signal.map(List.tail >> unsafe)sig)'。 但我得到類型不匹配的錯誤,因爲if子句想要一個布爾值,但獲得信號布爾值。有沒有解決這個問題的辦法? –

+0

不,沒有解決方法。你正在嘗試的是不可能的。 – Apanatshka

相關問題