我有一个应该在列表上运行的函数。首先,我必须将列表中的前两个元素与函数进行比较,然后将第三个元素与第一个比较的结果进行比较,依此类推,以便结果只是一个元素。我觉得我应该使用迭代,但我无法使它工作。我怎么能这样做?
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 Cell = Char
答案 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 。