大家好,我只是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
(半正式要求)。递归函数可以写成
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。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句