lexed トークンの上に小さなパーサーを書いています。それ以来、Read
インスタンスを実際に実装することはできません。ただし、既存のインスタンスを利用して、たとえば、 の解析をブートストラップすることができます。read :: Read a => String -> a
[String] -> a
a == Something
Read
Integer
それでは、試してみましょう。Something
トークンのリストからa を解析します。
import Safe -- gives us readMay :: Read a => String -> Maybe a
parseSomething :: [String] -> Maybe Something
parseSomething ("Something":strInt:stra:strb:_) =
do int <- readMay strInt
return $ Something int stra strb
parseSomething _ = Nothing
Maybe
として使用して、もう少しコンパクトにすることもできApplicative
ます。
import Control.Applicative
parseSomething :: [String] -> Maybe Something
parseSomething ("Something":strInt:stra:strb:_) =
Something <$> readMay strInt <*> pure stra <*> pure strb
parseSomething _ = Nothing
実際には、解析を続行できるように、未使用のトークンも返す必要があります。
parseSomething :: [String] -> (Maybe Something, [String])
parseSomething ("Something":strInt:stra:strb:rest) =
(Something <$> readMay strInt <*> pure stra <*> pure strb, rest)
parseSomething rest = (Nothing, rest)
このすべての構造を解析に持ち込む理由は、これが のようなパーサー コンビネータの空間に向かい始めるからParsec
です。複雑なものが必要になったときはいつでもRead
、Haskell の非常に優れた構文解析ライブラリーのいくつかを見ると便利になり始めます。