大家好我只是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
暗示
concat ys = xs
all (near t . sum) ys
,其中near t x
是一个谓词,表明x
是"关闭"到t
(半正式要求)。答案 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。