Haskell定义了一个简单的解析器来识别符号。某些测试失败

时间:2017-11-17 01:32:29

标签: parsing haskell monads

我目前正在阅读“在48小时内为自己编写一个方案”,在第2章中,它定义了一个简单的解析器“符号”来识别符号,然后定义一个函数“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"

此外,其他一些符号如&amp;或#也不起作用,并给出'索引太大的错误'。但符号如:%,@ ,!等这些工作正常。 我不明白为什么有些符号会起作用,而有些则没有。

此外,如果我在该符号上添加引号:

./hi "#"

Found value'#'

现在所有的符号都有用......

有人可以向我解释这些,因为我真的不熟悉monad的东西吗?

1 个答案:

答案 0 :(得分:4)

*扩展到当前工作目录中的所有文件。我想如果您执行ls,则第一个文件名以A开头。

#用于评论开始,因此没有传递给hii的参数。 &为背景带来了工作。

引号阻止shell翻译*#!,所以尝试引用每个传递的arg,它会没事的。

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