Parsing 读哈斯克尔的书

Parsing 读哈斯克尔的书,parsing,haskell,Parsing,Haskell,可以使用Scheme原语read,它使用一个字符流并输出一个s表达式(sexpr) 我正在尝试用Haskell编写解析器。上述的等价物是什么?我将如何实现它,以便如果传递“{+{-34}7}”它将返回(list'+(list'-34)7)(或等效项) 提前感谢。您最好使用适当的解析库,如,或 您可以滥用Read将任意字符串解析为某些数据表示形式(您必须定义这些数据表示形式)。您最好使用适当的解析库,如或 你可以滥用Read,将任意字符串解析为某种数据表示形式(你必须定义)。我认为haskell的

可以使用Scheme原语read,它使用一个字符流并输出一个s表达式(sexpr)

我正在尝试用Haskell编写解析器。上述的等价物是什么?我将如何实现它,以便如果传递
“{+{-34}7}”
它将返回
(list'+(list'-34)7)
(或等效项)


提前感谢。

您最好使用适当的解析库,如,或


您可以滥用
Read
将任意
字符串
解析为某些数据表示形式(您必须定义这些数据表示形式)。

您最好使用适当的解析库,如或


你可以滥用
Read
,将任意
字符串
解析为某种数据表示形式(你必须定义)。

我认为haskell的新手在想知道“我能做点什么吗?”时首先要问的问题之一是“类型应该是什么?”。如果你想做你想做的事,那么我建议你写一篇类似这样的AST:

data AST = Num Int
         | Add AST AST
         | Sub AST AST
         | Mul AST AST
         etc.
然后,您可以编写以下类型的解析器:

parseAST :: String -> AST
要真正编写这个解析器,您可能需要使用类似于parsec的东西,不过如果语法是您所描述的,那么您可能可以手工编写自己的parsed,这将非常好地工作(并帮助您学习)

从那里,您可以编写可以计算AST的函数,也可以随意操作AST。但重要的是要认识到,您不能*在运行时创建新代码,因为这很可能不是类型安全的,或者根本不安全


*我相信有很多方法可以做到这一点,但我觉得更重要的是培养haskell初级程序员在进入更高级的主题之前应该学习的想法。

我认为所有haskell新手在想知道“我能做些什么吗?”时应该问的第一个问题是“类型应该是什么?”。如果你想做你想做的事,那么我建议你写一篇类似这样的AST:

data AST = Num Int
         | Add AST AST
         | Sub AST AST
         | Mul AST AST
         etc.
然后,您可以编写以下类型的解析器:

parseAST :: String -> AST
要真正编写这个解析器,您可能需要使用类似于parsec的东西,不过如果语法是您所描述的,那么您可能可以手工编写自己的parsed,这将非常好地工作(并帮助您学习)

从那里,您可以编写可以计算AST的函数,也可以随意操作AST。但重要的是要认识到,您不能*在运行时创建新代码,因为这很可能不是类型安全的,或者根本不安全


*我相信有很多方法可以做到这一点,但我觉得更重要的是培养haskell初级程序员在进入更高级的主题之前应该学习的想法。

你会发现这很有帮助:你会发现这很有帮助:好的,那么我该如何实现第二个选项呢?我在Read上找不到任何文档(我可以理解)。。。所以我不知道如何使用它。谢谢@克丽斯伦德:“第二选择”是指“滥用阅读”?基于我描述的原因,我建议不要这样做。否则,构建一个数据类型,比如Axman6在他的回答中开始描述的数据类型,然后编写一个合适的解析器,例如RWH,他们在哪里定义了一个类型,然后定义了它。好的,那么我该如何实现第二个选项呢?我在Read上找不到任何文档(我可以理解)。。。所以我不知道如何使用它。谢谢@克丽斯伦德:“第二选择”是指“滥用阅读”?基于我描述的原因,我建议不要这样做。否则,构建一个数据类型,比如Axman6在他的回答中开始描述的数据类型,然后编写一个适当的解析器,例如,请参见RWH,他们在其中定义了一个类型,然后定义了它。