2017-11-17 14 views
1

私は現在「自分で48時間以内にスキームを書く」と読んでいました。第2章では、シンボルを認識し、パーサーを呼び出すための関数 'readExpr'を定義するための単純なパーサー 'シンボル'私はいくつかのテストをしようとすると、Haskellはシンボルを認識するための単純なパーサを定義しました。いくつかのテストに失敗しました

module Main where 

import System.Environment 
import Text.ParserCombinators.Parsec hiding (spaces) 

main :: IO() 
main = do args <- getArgs 
      putStrLn (readExpr (args !! 0)) 

symbol :: Parser Char 
symbol = oneOf "!$%&|*+-/:<=?>@^_~#" 

readExpr :: String -> String 
readExpr input = case parse symbol "lisp" input of 
    Left err -> "Not Found" ++ show err 
    Right val -> "Found value" ++ show val 

は、しかし:

>>> ghc -package parsec -o hii C1.hs 

>>> ./hii * 

それは言う:

はまた
Not Found"lisp" (line 1, column 1): 
unexpected "A" 

、また&や#のようないくつかの他の記号は仕事と「インデックスを与えることはありません大きすぎるエラー '。しかし、以下のような記号:%、@ ,!これらは適切に機能します。 いくつかのシンボルはなぜ機能しないのかわかりません。また

、私はそのシンボルの上に引用符を追加した場合:

./hi "#" 

Found value'#' 

は今、すべての記号は仕事...

私は本当に精通していないよので、誰かが私にこれらを説明していただけますモナドのもの?

答えて

4

*は、現在の作業ディレクトリ内のすべてのファイルに展開されます。私はあなたがlsを実行する場合、最初のファイル名はAで始まっていると思います。

#はコメント用ですので、hiiにargsは渡されません。 &はバックグラウンドにジョブを持ち込みます。

引用符はシェルが*#!を翻訳するのを防ぐので、すべてのargを渡してみてください。うまくいくでしょう。最初の段落で


  1. http://tldp.org/LDP/abs/html/special-chars.html
+0

、それは拡張がシェルによって行われていることを指摘すると良いでしょう、とHaskellのとは全く無関係です。 Haskellプログラムは決して '*'を見ることはできませんが、その拡張だけです。 'echo commandWithFunnyChars'を使用することで、拡張を見るのに役立つこともあります。 – chi

関連する問題