Haskell拆分列表由总和值确定

时间:2016-03-23 13:41:55

标签: list haskell

大家好我只是Haskell的首发。我有这个清单[1.0, 2.0, 1.5, 1.5, n-1]。如何将此列表拆分为子列表,例如[3.0, 3.0,etc]。也就是说,当添加列表的值时,当总和等于给定的数字(在这种情况下为3)时,将列表分开。我希望这个问题有道理。如果Data.List中有一个可以执行此操作的功能,有人可以指出我吗?甚至filter功能。到目前为止我唯一能做的就是:

import Data.List 

import Text.Printf


--separate :: [Double] -> [(Double)]

separate = sum [1.0, 2.0, 0.5, 2.5, 3.0, 1.1, 2.0] -- [(1.0, 2.0),(0.5, 2.5),(3.0),(1.1,2.0)] (desired list)



main = do
 putStrLn (printf "list :  %s" $ show separate)   

更确切地说,要求是:

separate :: Double -> [Double] -> [[Double]]

separate t xs = ys暗示

  1. concat ys = xs
  2. all (near t . sum) ys,其中near t x是一个谓词,表明x是"关闭"到t(半正式要求)。

1 个答案:

答案 0 :(得分:2)

递归函数可以写成

split :: [Double] -> [[Double]]
split x = go x [] 0
     where go [] _ _ = []
           go (x:xs) acc s | x+s>=3 = (acc++[x]) : go xs [] 0
                           | otherwise = go xs (acc++[x]) (s+x) 

split [1.0,2.0,0.5,2.5,3.0,1.1,2.0]
[[1.0,2.0],[0.5,2.5],[3.0],[1.1,2.0]]
到目前为止,

携带累加器和总和,决定根据总和结转或拆分。

请注意,这是构建“至少”,而不是“近”。所以所有子列表都将大于或等于3.0。