2017-08-17 4 views
2

私はラムダ式を読み、ベータ版を出力するものを書こうとしています。 Lambdaは次のようにタイプされます:\ variable - >式とアプリケーションは(式)(式)の形式になります。だから、「\」は、それがラムダを処理するために知っている文字列の先頭にと「(」がアプリケーションを処理するために知って発見された場合に発見された場合アポストロフィ/文字リテラルはHaskellでどのように解析されますか?

私は定義されたラムダ式の型を持っています。

data Expression = Variable String 
       | Lambda Expression Expression 
       | Apply Expression Expression 

ここで私は、この関数をロードしようとすると、私は

lexical error in string/character literal at ':' 
を取得する入力

processInput :: String -> Expression 
processInput ('\':input) = processLambda input 
processInput ('(':input) = processApply input 
processInput str   = Variable str 

を読み取るための関数を書くでの私の最初の試みです

は、だから私は、代わりにガードを使用してみました:

processInput input 
    | head input == '\'      = processLambda (tail input) 
    | head input == '('      = processApply (tail input) 
    | otherwise        = Variable input 

をしかし、私は、これらの機能のいずれかで間違って何見当がつかない

lexical error in string/character literal at character ' ' 

を得ました。

答えて

6

バックスラッシュは文字列リテラルと文字リテラルの中の特殊文字です。リテラルに特別な意味を持つ印字不可能な文字、改行、文字を表すために使用します。たとえば、'\n'は改行で、'\b'はスペースで、'\''は一重引用符です(\なし、2番目の文字は文字リテラルの最後とみなされます)。

したがって、'\'と書くと、レクサーは文字リテラルの先頭にエスケープされた'が続きます。今度は別の'が文字リテラルを閉じることを期待していますが、代わりにコロンが得られ、エラーが発生します。

バックスラッシュを文字リテラルとして表すには、'\\'のような別のバックスラッシュでバックスラッシュをエスケープします。

2

バックスラッシュはエスケープ文字なので、単一のバックスラッシュを表すには倍増する必要があります。'\\'

processInput ('\\':input) = processLambda input 
... 

-- or... 
processInput input 
    | head input == '\\'      = processLambda (tail input) 
... 
関連する問題