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

Haskell如何从文件中读取S表达式?,haskell,Haskell,有一些源文件,它们位于S表达式中。哈斯克尔能读懂那些s-表达式吗?我需要这些s表达式作为匹配的模式来执行Haskell程序(假设这些s表达式已经是Haskell程序数据类型的格式)。例如 文件中的S表达式是:ArithBiOp Plus(AInt 5)(AInt 5),然后在haskell程序中,我可以将这一行匹配为ArithBiOp操作码oprand1操作数2,如果您询问是否有某种内置方法从此类文件读取数据,那么答案是否定的,不是真的 标准类型类Read和Show是一种穷人的序列化,它们做了类

有一些源文件,它们位于S表达式中。哈斯克尔能读懂那些s-表达式吗?我需要这些s表达式作为匹配的模式来执行Haskell程序(假设这些s表达式已经是Haskell程序数据类型的格式)。例如
文件中的S表达式是:
ArithBiOp Plus(AInt 5)(AInt 5)
,然后在haskell程序中,我可以将这一行匹配为
ArithBiOp操作码oprand1操作数2

,如果您询问是否有某种内置方法从此类文件读取数据,那么答案是否定的,不是真的

标准类型类
Read
Show
是一种穷人的序列化,它们做了类似的事情,期望
Read(Show x)
==
x
,并且
Show x
的输出(评估为Haskell源代码)也等于
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
或解析器即可。对于简单的东西,你应该做你需要的一切


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

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

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

然后你可以使用
readFile
获取一个字符串,并将其转换为
read

啊,我刚刚将问题的标题编辑为“How can…”。那怎么办?就像用普通的哈斯克尔阅读一样?哈哈,对不起,这只是一个玩笑而已。请看下面我的实际答案。@camccann是的,Haskell可以!我们可以相信的常数!:)