为每个列表元素编号,并在haskell中设置文本格式

时间:2018-11-23 16:02:26

标签: haskell numbers element

我想给每个数字一个从1到长度(x:xs)的数字,就像书的页码一样。不幸的是,它只能向后工作。

{{1}}

我又如何从文本中删除任何新行和制表符,并用实际的新行和制表符替换?

2 个答案:

答案 0 :(得分:3)

Prelude中有多个内置的Haskell函数,可以很好地学习和使用它们。当您考虑将两个不同的列表合并到一个结果列表中时,zipzipWith是其中两个:

[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的数字引入该结果?