2014-09-21 15 views
1

我正在使用parsec來解析輸入,並且將解析的字符存儲到一個函數中,然後在case表達式中調用該函數,其中將解析的字符串與一組關鍵字。 這是我對這個代碼:在上下文中將字符串與Haskell中的常規字符串進行比較

import Text.Parsec.Prim 
import Text.Parsec.Char 
import Text.Parsec.Error 
import Text.Parsec.String 
import Text.Parsec.Combinator 

tokenize :: Parser String 
tokenize =do op <- many1 $ letter <|> 
          char '+' <|> 
          char '^' <|> 
          char '-' <|> 
          char '>' <|> 
          char '*' 
      return op 

curveOpt inval = case tokenize of 
         (Parser "++") -> 
         (do c <- curve 
          curveOpt $ Connect inval c) 

我從編譯器得到的錯誤是:

Couldn't match type `[Char]' 
        with `ParsecT String() Data.Functor.Identity.Identity String' 
    Expected type: Parser String 
     Actual type: [Char] 
    In the pattern: "++" 
    In a case alternative: 
     "++" 
      -> (do { c <- curve; 
        curveOpt $ Connect inval c }) 
    In the expression: 
     case tokenize of { 
     "++" 
      -> (do { c <- curve; 
        curveOpt $ Connect inval c }) } 

從我瞭解的是,我試圖比較解析器字符串,字符串。如何比較這兩種不同類型? 我是否應該改變標記大小的類型,如果是的話,怎麼樣?

在此先感謝。

+0

/Attoparsec你導入的哪個變種秒差距? – Arnon 2014-09-21 10:30:59

+0

再次檢查問題。只是添加了進口 – sokras 2014-09-21 10:39:30

回答

2

tokenize在解析器monad中返回一個字符串。 你會最佳希望將其拉出一個做記號內curveOpt

curveOpt inval = do op <- tokenize 
        case op of 
         "++" -> ..... 
相關問題