在 Haskell 中遍历 String/Text 时使用状态
Using states when traversing through a String/Text in Haskell
我是 Haskell 的新手,我在解决以下问题时遇到了问题:
我正在获取一个文件作为输入(Text/String 类型,性能现在不是一个重要的参数),我正在尝试格式化它以删除它的某些部分。
我在想我会折叠它并将文件的内容放入 String/Text,并且每当我到达我想要删除的部分时(因为当可删除的内容出现时它用一个符号表示并且它有有效内容到来时的符号),我改变折叠的“状态”,现在它不应该积累,当指示真实内容到来的符号回来时,状态应该告诉折叠继续积累.
到目前为止,我尝试过的是以下内容:
checkForComment :: String -> Bool -> Bool
checkForComment "/*" _ = False
checkForComment "*/" _ = True
checkForComment "//" _ = False
checkForComment "/n" _ = True
checkForComment _ True = True
checkForComment _ False = False
eraseComments :: [String] -> String
eraseComments = foldr (\emptyList listWithInput -> if checkForComment listWithInput then listWithInput ++ emptyList else []) []
当前的示例当然不起作用,因为对于我的 checkForComment 函数,我应该传递一个描述先前状态的参数。
我希望我正确地描述了这个任务,不幸的是我无法解决它。如果有人可以提供帮助,我将非常高兴! :D
最基本的选择是使用显式递归,编写一个带有标志的辅助函数,该标志表示“我在评论中吗?”。例如
removeC :: String -> Bool -> String
removeC ('/':'*':rest) False = removeC rest True
removeC (x:rest) False = x : removeC rest False
removeC ('*':'/':rest) True = removeC rest False
removeC (_:rest) True = removeC rest True
removeC "" _ = ""
然后,定义为标志提供初始状态的实际函数:
eraseComments :: String -> String
eraseComments str = removeC str False
可以将其变成折叠,但这可能不会导致更简单、更易读的代码,因为您需要处理额外的标志。
请注意,上面的代码只是一个示例,可能并不完全适合您的任务。不过,您可能已经了解了总体思路,并可以尝试对其进行调整以满足您的需求。
我是 Haskell 的新手,我在解决以下问题时遇到了问题:
我正在获取一个文件作为输入(Text/String 类型,性能现在不是一个重要的参数),我正在尝试格式化它以删除它的某些部分。
我在想我会折叠它并将文件的内容放入 String/Text,并且每当我到达我想要删除的部分时(因为当可删除的内容出现时它用一个符号表示并且它有有效内容到来时的符号),我改变折叠的“状态”,现在它不应该积累,当指示真实内容到来的符号回来时,状态应该告诉折叠继续积累.
到目前为止,我尝试过的是以下内容:
checkForComment :: String -> Bool -> Bool
checkForComment "/*" _ = False
checkForComment "*/" _ = True
checkForComment "//" _ = False
checkForComment "/n" _ = True
checkForComment _ True = True
checkForComment _ False = False
eraseComments :: [String] -> String
eraseComments = foldr (\emptyList listWithInput -> if checkForComment listWithInput then listWithInput ++ emptyList else []) []
当前的示例当然不起作用,因为对于我的 checkForComment 函数,我应该传递一个描述先前状态的参数。
我希望我正确地描述了这个任务,不幸的是我无法解决它。如果有人可以提供帮助,我将非常高兴! :D
最基本的选择是使用显式递归,编写一个带有标志的辅助函数,该标志表示“我在评论中吗?”。例如
removeC :: String -> Bool -> String
removeC ('/':'*':rest) False = removeC rest True
removeC (x:rest) False = x : removeC rest False
removeC ('*':'/':rest) True = removeC rest False
removeC (_:rest) True = removeC rest True
removeC "" _ = ""
然后,定义为标志提供初始状态的实际函数:
eraseComments :: String -> String
eraseComments str = removeC str False
可以将其变成折叠,但这可能不会导致更简单、更易读的代码,因为您需要处理额外的标志。
请注意,上面的代码只是一个示例,可能并不完全适合您的任务。不过,您可能已经了解了总体思路,并可以尝试对其进行调整以满足您的需求。