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

在haskell中为每个列表元素编号并格式化文本,haskell,numbers,element,Haskell,Numbers,Element,我想给每个人一个从1到lengthx:xs的数字,就像一本书的页码一样。不幸的是,它只能反向工作 numberL :: [String] -> [String] numberL [] = [] numberL (x:xs) = ([show (length(x:xs)) ++ ": " ++ x] ++ numberL (xs)) 另外,如何从文本中删除任何新行和制表符,并将其替换为实际的新行和制表符?Prelude中有多个内置的Haskell函数,可以很好地学习和使用它们。zip和zi

我想给每个人一个从1到lengthx:xs的数字,就像一本书的页码一样。不幸的是,它只能反向工作

numberL :: [String] -> [String]
numberL [] = []
numberL (x:xs) = ([show (length(x:xs)) ++ ": " ++ x] ++ numberL (xs))

另外,如何从文本中删除任何新行和制表符,并将其替换为实际的新行和制表符?

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` 

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` 

要想做对,重要的是要理解为什么你的想法是错误的。您的递归如下所示:

numberL (x:xs) = ... ++ numberL xs
所以你计算出数字xs,然后在它前面放一些东西。如果numberlxs是正确的,那么它将从1开始编号,如:1:…,2:…,3:。。。。因此,您永远不可能仅仅通过在前面添加新元素来从numberlxs构建numberlx:xs。整个编号都是错误的。相反,您必须更改numberlxs的整个编号

因此,问题是为了计算numberlx:xs,知道numberlxs不是很有用,因为numberL总是从1开始编号

因此,解除这一限制。构建一个从n开始编号的函数


现在你要问自己的问题是,为了给x:xs编号,从n开始,你需要给xs编号,从哪个数字开始?那么你是如何将编号为x的结果引入到这个结果中的呢

要想做对,重要的是要理解你为什么想错了。您的递归如下所示:

numberL (x:xs) = ... ++ numberL xs
所以你计算出数字xs,然后在它前面放一些东西。如果numberlxs是正确的,那么它将从1开始编号,如:1:…,2:…,3:。。。。因此,您永远不可能仅仅通过在前面添加新元素来从numberlxs构建numberlx:xs。整个编号都是错误的。相反,您必须更改numberlxs的整个编号

因此,问题是为了计算numberlx:xs,知道numberlxs不是很有用,因为numberL总是从1开始编号

因此,解除这一限制。构建一个从n开始编号的函数

现在你要问自己的问题是,为了给x:xs编号,从n开始,你需要给xs编号,从哪个数字开始?那么你是如何将编号为x的结果引入到这个结果中的呢