2017-04-24 5 views
2

私はHaskellにパーサを書き込もうとしています。この場合、少なくとも1の長さの文字列を解析する関数が必要です。以下に宣言する型があります。少なくとも1文字の長さの文字列を解析します。

type Pname = String 

私の持つ機能は動作しません。

pname :: Parser Pname 
pname = (some ['a' .. 'z']) <* sc 

が、それは私にエラー与える::

scが空白とコメント(私はこのパーサで助けを求め https://mrkkrp.github.io/megaparsec/tutorials/parsing-simple-imperative-language.htmlでチュートリアル以下となっている)のための私のスペース、消費者がどこにあるか私が持っているコードは、以下の通りです
Couldn't match type ‘[]’ 
        with ‘ParsecT Dec String Data.Functor.Identity.Identity’ 
    Expected type: ParsecT 
        Dec String Data.Functor.Identity.Identity Char 
     Actual type: [Char] 
    In the first argument of ‘some’, namely ‘['a' .. 'z']’ 
    In the first argument of ‘(<*)’, namely ‘(some ['a' .. 'z'])’ 
    In the expression: (some ['a' .. 'z']) <* sc 

これはなぜ機能しないのですか?

答えて

1

は、おそらくあなたは、それらの文字のいずれかを受け入れ、パーサーに文字のリストをオンにする

pname = some (oneOf ['a' .. 'z']) <* sc 

のようにoneOf(またはあなたのパーサライブラリから同様の機能)を使用することを意味しました。

+0

1つ以上の文字を受け入れる必要があるため、oneOfが適しているとは思われません。 –

+0

@datguywelbz 'oneOf ['a' .. 'z']'は正確に1文字を受け取ります。 'some(oneOf ['a' .. 'z'])'は1つ以上を受け入れます([some'のためのドキュメンテーション](https://hackage.haskell.org/package/base-4.9.1.0/)を参照してください。 docs/Control-Applicative.html#v:some))。 –

関連する問題