Haskell如何从文件中读取S表达式?

时间:2011-06-21 16:55:03

标签: haskell

有一些源文件,它们在S表达式中。 Haskell可以读取那些s表达式吗?我需要那些s表达式作为匹配的模式来执行Haskell程序(假设那些s表达式已经是我的haskell程序数据类型的格式)。例如, 文件中的S表达式为:ArithBiOp Plus (AInt 5) (AInt 5),然后在haskell程序中,我可以将此行与ArithBiop opcode oprand1 operand2匹配。

2 个答案:

答案 0 :(得分:10)

如果您在询问是否有一些内置方法可以从这些文件中读取数据,那么答案是否定的,不是真的。

标准类型类ReadShow是一种穷人的序列化,它做了类似的事情,期望read (show x) == x并且被评估为Haskell源的show x的输出也等于x。但是,如果您有来自其他来源的任意表达式,那么假设它们与read所期望的格式相匹配可能并不安全,即使(如您的示例中)它们将非常相似。

另一方面,S表达式几乎是世界上最容易解析的东西,因此用Parsec或其他东西来解读数据可能是微不足道的。

如果您可以充分约束输入以确信它将与您从类型的默认实例获得的show的输出相匹配,那么read应该可以正常工作。请注意,默认的Read实例对虚假括号和空格之类的内容至少有些健壮:

> read " Just 1" :: Maybe Int
Just 1
> read " Just   1" :: Maybe Int
Just 1
> read " Just (1)" :: Maybe Int
Just 1
> read "(Just (1))" :: Maybe Int
Just 1

等等。


哦,如果你问的是如何从文件中获取数据,你不需要做任何特别的事情。只需使用您用于其他任何内容的相同文件I / O,并将字符串提供给read或解析器。对于简单的东西the System.IO module应该做你需要的一切。

在使用read并且每行有一个值的极其简单的情况下,从stdin读取,readLn函数是一个方便的快捷方式。

答案 1 :(得分:4)

如果您很幸运,您可能能够创建具有完全正确形式的数据类型,以使用read从文件中获取数据。例如:

data Exp = ArithBiOp Op Exp Exp | AInt Integer deriving (Show, Read)
data Op = Plus | Minus deriving (Show, Read)

然后,您只需使用readFile获取字符串并将其转换为read