2017-05-05 61 views
1

我有一個函數,應該在列表上運行。首先,我必須將列表中的前兩個元素與該函數進行比較,然後將第三個元素與第一個比較的結果進行比較等等,以便結果只是一個元素。我覺得我應該使用迭代,但我無法使它工作。我怎樣才能做到這一點?功能上的結果

combineOption :: Cell -> Cell -> Cell 
combineOption 'f' 'f' = 'f' 
combineOption 'e' 'e' = 'e' 
combineOption _ _ = 'u' 

combineRow :: [Cell] -> [Cell] -> [Cell] 
combineRow [] [] = [] 
combineRow l k = [ combineOption (l !! i) (k !! i) | i <- [0..(length(l)-1)] ] 

combineLineOptions :: [[Cell]] -> [Cell] 
combineLineOptions l = iterate ...       <================== 

其中type細胞=字符

+1

函數應該做什麼?你能提供一個例子嗎?它的類型是什麼? 'iterate'看起來是錯誤的,但很難在不知道函數應該做什麼的情況下使用什麼。它可能是'foldl'或'scanl'或者一些變體。 – chi

+0

您是否想將第四個元素與第二個比較的結果進行比較等等,以便最終結果只是一個元素? – immibis

+0

是的。這正是我想要做的。 –

回答

1

具有一個應該列表上運行的功能。首先,我必須將列表中的前兩個元素與該函數進行比較,然後將第三個元素與第一個比較的結果進行比較等等,以便結果只是一個元素。

IIUC,這正是foldl1所做的。例如,如果 「比較」 是差異,那麼

Prelude Data.List> let l = [1, 2, 3] 
Prelude Data.List> foldl1 (-) l 
-4 

「比較結果」 1和2,然後在 「比較」 的結果與3,所以它是1 - 2 - 3 = -4