Haskell 定义了一个简单的解析器来识别符号。某些测试失败
Haskell defined a simple parser to recognise symbols. failure in some testing
我正在阅读 "write yourself a scheme in 48 hours",在第 2 章中它定义了一个简单的解析器 'symbol' 来识别符号,然后定义了一个函数 'readExpr' 来调用解析器。
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"
此外,& 或 # 等其他一些符号也不起作用并给出 'index too large error'。但是像这样的符号:%,@,!等这些工作正常。
我不明白为什么有些符号有效而有些符号无效。
此外,如果我在该符号上添加引号:
./hi "#"
Found value'#'
现在所有符号都可以使用了...
有人能给我解释一下吗,因为我真的不熟悉 monad 的东西?
*
扩展到当前工作目录中的所有文件。我猜如果你执行 ls
,第一个文件名是以 A
.
开头的
#
用于注释开始,因此没有参数传递给 hii
。 &
将作业移至后台。
quotes 阻止 shell 翻译 *#!
,所以尝试引用每个传递的 arg,它会没事的。
我正在阅读 "write yourself a scheme in 48 hours",在第 2 章中它定义了一个简单的解析器 'symbol' 来识别符号,然后定义了一个函数 'readExpr' 来调用解析器。
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"
此外,& 或 # 等其他一些符号也不起作用并给出 'index too large error'。但是像这样的符号:%,@,!等这些工作正常。 我不明白为什么有些符号有效而有些符号无效。
此外,如果我在该符号上添加引号:
./hi "#"
Found value'#'
现在所有符号都可以使用了...
有人能给我解释一下吗,因为我真的不熟悉 monad 的东西?
*
扩展到当前工作目录中的所有文件。我猜如果你执行 ls
,第一个文件名是以 A
.
#
用于注释开始,因此没有参数传递给 hii
。 &
将作业移至后台。
quotes 阻止 shell 翻译 *#!
,所以尝试引用每个传递的 arg,它会没事的。