2016-12-18 4 views
0

私は定義されたパーサーオブジェクトがあります。ハスケル:Monad定義から<*>の定義をどうやって見つけますか?

newtype Parser a = Parser (String -> [(String, a)]) 

し、それらを生成する機能:

produce :: a -> Parser a 
produce x = Parser (\ts -> [(ts, x)]) 

そして、私は一つに複数のパーサをバインドできるようにするには、このパーサー・オブジェクトのモナドのインスタンス:

instance Monad Parser where 
    return = produce 
    Parser px >>= f = Parser (\ts -> 
    concat([parse (f x) ts' | (ts', x) <- px ts])) 

私はまた、異なるタイプの文字列を解析するために、さまざまなタイプの複数のパーサーをチェーン化するのに非常に喜んで使用していますそれ内の部品。 *>を介して定義され<もちろん

(<*>) = ap 

しかし、私は、私は理解し、それが正確にどのように動作するかを説明することができていますように、明示的に定義したいと私はそれを把握することができませんでしたでる。

この例では、apの定義を明示的に見つける方法、または< *をどのように見つけ出すことができますか?

何かに関するアドバイスや、どうすればそれをどうすればうまくいくのでしょうか。

ありがとうございました。

+2

ここでは、 'ap'のソースを見つけることができます:http://hackage.haskell.org/package/base-4.9.0.0/docs/src/GHC.Base.html#ap(これは楽しい演習ですが自分自身)。あなたが上に掲示した実装から(代数クラスのように) 'return'と' >> = 'の代りに右辺を置き換えてください。 – jberryman

答えて

2

あなたは

f <*> x = do 
    f' <- f 
    x' <- x 
    return (f' x') 

または、同等

f <*> x = 
    f  >>= (\f' -> 
    x  >>= (\x' -> 
    return (f' x'))) 

からスタートし、必要に応じて>>=returnを拡張することができます。

関連する問題