2011-06-21 18 views
2

いくつかのソースファイルがありますが、それらはS式で記述されています。 Haskellはそれらのs式を読むことができますか?これらのs式は、Haskellプログラムを実行するためのパターンとして必要です(これらのs式はすでに私のhaskellプログラムのデータ型の形式であるとします)。たとえば、 ファイル内のS式はArithBiOp Plus (AInt 5) (AInt 5)であり、haskellプログラムではこの行をArithBiop opcode oprand1 operand2と一致させることができます。HaskellはどのようにS式をファイルから読み込むことができますか?

+2

はい、ハスケルはそれを行うことができます! –

+0

ああ、私はちょうど質問の私のタイトルを "How can ....."に編集しました。それで?通常のHaskellを使うのが好きですか? –

+0

母、申し訳ありません、それは何らかの形で走っている冗談です。私の*実際の*答えを見てください。 –

答えて

4

あなたが運が良ければ、readを使用してファイルからデータを取得するための正しい形式のデータ型を作成することができます。あなたたとえば:

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

次に、あなただけの文字列を取得し、readでそれを変換するためにreadFileを使用することができます。

10

このようなファイルからデータを読み込むための組み込みメソッドがあるかどうかを確認するには、答えはいいえ、実際はありません。期待read (show x) == xとHaskellのソースとして評価show xの出力は、またxに等しくなるように

標準型クラスReadShowは、類似した何かを貧しい人の直列化の一種です。しかし、他のソースからの任意の式がある場合は、たとえ(あなたの例のように)非常に似ているとしても、readで期待されるフォーマットと一致すると仮定するのはおそらく安全ではありません。

一方、S式は世界で最も簡単に解析できるので、Parsecなどでデータを読み取るのは簡単ではないでしょう。

showの出力に一致すると確信できるように入力を十分に制限できれば、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 

などなど:デフォルトReadインスタンスはスプリアス括弧と空白のようなものに、少なくともいくらか堅牢であることに注意してください。


あなたがファイルからデータを取得する方法について質問している場合、特別な操作は必要ありません。他のものに使用するのと同じファイルI/Oを使用して、文字列をreadまたはパーサーに渡してください。簡単なものについては、the System.IO moduleは必要なものすべてを行う必要があります。

readを使用し、1行に1つの値を持つ非常に単純な例では、stdinから読み取ると、readLn関数が便利なショートカットです。

+0

情報をありがとう、私はそれを最初に試してみます。 –

関連する問題