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

标签 haskell

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

最佳答案

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

标准类型类 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 并且每行有一个值的极其简单的情况下,从标准输入读取 readLn函数是一个方便的快捷方式。

关于haskell - Haskell 如何从文件中读取 S 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6429047/

相关文章:

haskell - Haskell 中的 pretty-print : Break outer groups when printing nested tuples

haskell - 加载/修改/保存对文本文件的更改

haskell - 根据前一个元素计算列表的下一个元素

list - Haskell 在某个位置重复元素

haskell - 模板haskell中的数据构造函数

Haskell:类型 f a 实际上是什么意思?

haskell - 您是否发现仍然需要可以更改的变量,如果需要,为什么?

list - Haskell:列表推导式是高阶函数吗?

haskell - haskell出队的不变性

haskell - 高阶函数