首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Haskell:通过选定的子字符串和空格分隔字符串

Haskell:通过选定的子字符串和空格分隔字符串
EN

Stack Overflow用户
提问于 2010-11-28 10:16:24
回答 3查看 248关注 0票数 2

我对Haskell还很陌生,所以如果这个问题有一个明显的答案,请道歉……

我想做一个函数,拆分以下所有的字符串列表,即字符串

代码语言:javascript
运行
复制
["int x = 1", "y := x + 123"]
["int   x=   1", "y:=   x+123"] 
["int x=1", "y:=x+123"] 

都包含在相同的字符串中,即[字符串]:

代码语言:javascript
运行
复制
[["int", "x", "=", "1"], ["y", ":=", "x", "+", "123"]]

您可以使用map words.lines作为第一个字符串。

但是我不知道有什么很好的方法来考虑其他的--你可以使用不同的子字符串"="":=""+"等来分解主字符串。

感谢您抽出时间在Haskell上给我一些启发:-)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-28 11:21:21

Prelude附带了一个鲜为人知的方便函数,名为lex,这是一个用于Haskell表达式的lexer。这些与您需要的表单相匹配。

代码语言:javascript
运行
复制
lex :: String -> [(String,String)]

这是一个多么奇怪的类型啊!该列表用于与标准类型的解析器进行交互,但我非常确定lex总是返回1或0个元素(0表示解析失败)。元组是(token-lexed, rest-of-input),所以lex只获取一个令牌。因此,对整个字符串进行lex的一种简单方法是:

代码语言:javascript
运行
复制
lexStr :: String -> [String]
lexStr "" = []
lexStr s = 
    case lex s of
        [(tok,rest)] -> tok : lexStr rest
        []           -> error "Failed lex"

为了安抚学究,这段代码的形式很糟糕。显式地调用error,而不是使用Maybe返回合理的错误,假设lex只返回1或0个元素,等等。可靠地做到这一点的代码长度大致相同,但明显更抽象,所以我留出了初学者的眼睛。

票数 7
EN

Stack Overflow用户

发布于 2010-11-28 10:26:03

我将研究一下parsec,并构建一个简单的语法来解析您的字符串。

票数 3
EN

Stack Overflow用户

发布于 2010-11-28 10:47:39

使用单词怎么样?) words :: String -> [String]和单词不关心空格。

代码语言:javascript
运行
复制
words "Hello World"
= words "Hello     World"
= ["Hello", "World"]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4294973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档