在haskell中为每个列表元素编号并格式化文本
我想给每个人一个从1到lengthx:xs的数字,就像一本书的页码一样。不幸的是,它只能反向工作在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
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的结果引入到这个结果中的呢