有一些源文件,它们在S表达式中。 Haskell可以读取那些s表达式吗?我需要那些s表达式作为匹配的模式来执行Haskell程序(假设那些s表达式已经是我的haskell程序数据类型的格式)。例如,
文件中的S表达式为:ArithBiOp Plus (AInt 5) (AInt 5)
,然后在haskell程序中,我可以将此行与ArithBiop opcode oprand1 operand2
匹配。
答案 0 :(得分:10)
如果您在询问是否有一些内置方法可以从这些文件中读取数据,那么答案是否定的,不是真的。
标准类型类Read
和Show
是一种穷人的序列化,它做了类似的事情,期望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
。