String 如何获取文档每个部分的第一段和最后一段?
我在为以下问题构造算法时遇到了困难:给定一本教科书(),查找每个部分的第一段和最后一段 在Haskell中,通过传递换行符参数,使用String 如何获取文档每个部分的第一段和最后一段?,string,algorithm,haskell,String,Algorithm,Haskell,我在为以下问题构造算法时遇到了困难:给定一本教科书(),查找每个部分的第一段和最后一段 在Haskell中,通过传递换行符参数,使用split、groupify或filter可以轻松获取每个段落,效果很好。然而,其余的对我来说很复杂(我只熟悉OOP)。如果我们将标题作为基本大小写,文本中将有两个标题字符串:一个在索引部分,另一个在文本本身。程序如何区分它们?此外,代码如何知道两段之间是否有两行空行 这是我试图解决的问题 通过将文本拆分为段落的元素,将每个段落放入一个数组中 搜索数组中标题的索引,
split
、groupify
或filter
可以轻松获取每个段落,效果很好。然而,其余的对我来说很复杂(我只熟悉OOP)。如果我们将标题作为基本大小写,文本中将有两个标题字符串:一个在索引部分,另一个在文本本身。程序如何区分它们?此外,代码如何知道两段之间是否有两行空行
这是我试图解决的问题
标题可以是整数、极限等。下面是我如何处理这个问题的示意图 我假设您有一些函数
isTitle::String->Bool
,可以
确定某个字符串是否为标题,以及您是否有文本
拆分为段落和标题列表(即类型[String]
)
我从一个数据类型开始,在列表中有两个元素的游标,
这样的数据类型通常称为Zipper
data TwoZip a =
TwoZip { front :: [a]
, first :: a
, second :: a
, back :: [a]
}
deriving (Eq, Show)
-- make a zipper from a list
mkZip :: [a] -> Maybe (TwoZip a)
mkZip (first:second:back) = Just (TwoZip [] first second back)
mkZip _ = Nothing
-- advance the zipper
advance :: TwoZip a -> Maybe (TwoZip a)
advance TwoZip{..}
| (x:xs) <- back = Just (TwoZip (first:front) second x xs)
advance _ = Nothing
-- and rewind our zipper (not needed in this case but nice for
-- completeness sake)
rewind :: TwoZip a -> Maybe (TwoZip a)
rewind TwoZip{..}
| (x:xs) <- front = Just (TwoZip xs x first (second:back))
rewind _ = Nothing
然后是一些(简化的)测试数据:
testData = map show [1,2,3,1,3,4,1,4,3]
isTitle = (== "1")
first_paragraphs = findFirsts isTitle testData
正如我们所希望的:
λ> first_paragraphs
["2","3","4"]
您可能会发现如何将此扩展到查找
最后一段以及如何在一次迭代中完成它们。
文本中将有两个标题字符串
在这个特定文本中,文本本身的标题字符串总是紧跟在换行符之后。在索引中,它们前面有空格。什么是节?看起来是问题的关键部分,可能是第一个要分开的部分,但你几乎没有在问题中提到它。如果你在算法中添加一些小例子,尤其是段落、标题和章节,会更清楚。我为问题添加了更新。谢谢你提醒我,我认为这不是解决我问题的正确方法:/请详细说明原因!首先,我不认为这不能解决标题和段落之间没有空行的问题,你的测试用例是一个整数数组,我无法解决如何使用我的文件进行测试。代码对我来说是如此复杂和先进,我不希望它成为这样,因为我对haskell很陌生,正在寻找一个更基本、更容易理解的解决方案。@user3104760:你能使用上面的任何一个吗?是的,很抱歉我的误解,我只是在学习全新的。谢谢你的帮助:)
testData = map show [1,2,3,1,3,4,1,4,3]
isTitle = (== "1")
first_paragraphs = findFirsts isTitle testData
λ> first_paragraphs
["2","3","4"]