我想给每个数字一个从1到长度(x:xs)的数字,就像书的页码一样。不幸的是,它只能向后工作。
{{1}}
我又如何从文本中删除任何新行和制表符,并用实际的新行和制表符替换?
答案 0 :(得分:3)
Prelude
中有多个内置的Haskell函数,可以很好地学习和使用它们。当您考虑将两个不同的列表合并到一个结果列表中时,zip
和zipWith
是其中两个:
[1..]
将为您生成索引列表,这是一个无限列表
appendIndex :: String -> Int -> String
appendIndex s i = (show i) ++ " :" ++ s
indexThem :: [String] -> [String]
indexThem l = zipWith appendIndex l [1..]
如果您想使用zip
,它更基本,但是更冗长:
appendIndex :: (String,Int) -> String
appendIndex (s,i) = (show i) ++ " :" ++ s
indexThem :: [String] -> [String]
indexThem l = fmap appendIndex $ zip l [1..]
-- if you dont know about Functors yet, `fmap` is the generic way of doing `map`
答案 1 :(得分:3)
为正确起见,重要的是要了解为什么您在想错。您的递归如下所示:
numberL (x:xs) = ... ++ numberL xs
因此,您计算numberL xs
,然后在它前面放一些东西。如果numberL xs
是正确的,则它将从1开始编号,例如:1:..., 2:..., 3:...
。因此,您永远无法仅通过在前面添加新元素来从numberL (x:xs)
构建numberL xs
。整个编号是错误的。相反,您必须更改numberL xs
的整个编号。
因此,问题在于,由于numberL xs
总是从1开始编号,因此知道numberL (x:xs)
来计算numberL
并不是很有用。
因此取消该限制。建立一个以n
numberLFrom :: Int -> [String] -> [String]
numberLFrom n [] = ...
numberLFrom n (x:xs) = ...
现在您要问自己的问题是,为了从(x:xs)
开始编号n
,您需要从哪个号码开始编号xs
?然后,如何将编号为x
的数字引入该结果?