簡體   English   中英

Haskell Parsec遇到了麻煩

[英]Haskell Parsec woes

我正在嘗試學習Parsec並嘗試解析一個簡單的電子郵件地址。 我嘗試了以下代碼。 我的預期輸出是整個電子郵件地址作為字符串。 但是當我運行代碼時,我只能得到“.com”可能會告訴我發生了什么事嗎?

{-# LANGUAGE NoMonomorphismRestriction #-}

import Text.Parsec
import Control.Applicative hiding ((<|>))

email = many1 alphaNum
     *> char '@'
     *> many1 alphaNum
     *> string ".com"

emailstr = parse email "" "xxxx@yyy.com"

*>的類型簽名表示它返回第二個解析器的結果,並拋棄第一個解析器的結果。 因此, email僅返回序列中最終解析器的結果。

你可能想要的更像是什么

email =
  stitch
    <$> many1 alphaNum
    <*> char '@'
    <*> many1 alphaNum
    <*> string ".com"

這將運行四個解析器,並將每個解析器的結果作為參數傳遞給stitch 如果您為stitch編寫合適的實現:

stitch a b c d = a ++ [b] ++ c ++ d

然后你應該找回你的字符串。

請注意,此時,您還可以將用戶名和域放入數據結構的單獨字段中:

data Email = Email {username, domain :: String}

email =
  Email
    <$> many1 alphaNum
    <*  char '@'
    <*> ((++) <$> many1 alphaNum <*> string ".com")

現在,您的解析器返回一個Email結構,而不僅僅是一個純字符串。 這可能不是你想要的,但它演示了如何編寫更復雜的解析器。

所有這些都是使用Parsec的Applicative接口,這通常被認為是好的風格。 使用Parsec的一種方法是Monad接口:

email = do
  a <- many1 alphaNum
  b <- char '@'
  c <- many1 alphaNum
  d <- string ".com"
  return (a ++ [b] ++ c ++ d)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM