首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Parsec和应用风格

Parsec和应用风格
EN

Stack Overflow用户
提问于 2012-10-25 17:01:56
回答 2查看 1.4K关注 0票数 10

有人能帮助我理解如何使用应用风格来编写Parsec解析器吗?这是我的代码:

代码语言:javascript
复制
module Main where
import Control.Applicative hiding (many)
import Text.Parsec
import Data.Functor.Identity
data Cmd = A | B deriving (Show)

main = do
  line <- getContents
  putStrLn . show $ parseCmd line

parseCmd :: String -> Either ParseError String
parseCmd input =  parse cmdParse "(parser)" input

cmdParse :: Parsec String () String
cmdParse = do
  slash <- char '/'
  whatever <- many alphaNum
  return (slash:whatever)

cmdParse2 :: String -> Parsec String () String
cmdParse2 = (:) <$> (char '/') <*> many alphaNum

但是当我尝试编译它时,我得到了以下结果:

代码语言:javascript
复制
/home/tomasherman/Desktop/funinthesun.hs:21:13:
    Couldn't match expected type `Parsec String () String'
                with actual type `[a0]'
    Expected type: a0 -> [a0] -> Parsec String () String
      Actual type: a0 -> [a0] -> [a0]
    In the first argument of `(<$>)', namely `(:)'
    In the first argument of `(<*>)', namely `(:) <$> (char '/')'
Failed, modules loaded: none.

我的想法是,我希望cmdParse2做与cmdParse相同的事情,但使用应用型stuff...my方法可能是完全错误的,我是新手

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-25 17:26:39

你的应用用法是正确的,你只是有一个错误的签名。尝试:

代码语言:javascript
复制
cmdParse2 :: Parsec String () String
票数 5
EN

Stack Overflow用户

发布于 2012-10-25 17:24:27

你的方法在我看来是正确的,问题是cmdParse2的类型错误。它应该与cmdParse具有相同的类型。顺便说一句,您可以在应用风格的解析器中省略char '/'两边的括号。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13065102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档