2016-10-05 3 views
1

私はハスケルの初心者で、これをやろうとしていますexerciseパーサをFunctorに変える必要がある

私は、Applicative Parserを実装するためにFunctor Parserを実装する必要があります。

しかし、 "最初の関数ヒント"を使っても、Functorを実装する方法には固執しています:(実際は、 "fmap f Parser a"を使って達成しようとしていることを理解できません。 ?

誰かがそれを説明することができ

+2

あなたのパーサータイプの定義と、インスタンスを自分で定義しようとする試みを私たちに教えてください。しかしどちらにしても、最初にファンクタで少し読んでみてください...本当に、これはあまり難しくありません。もしあなたがそれらと何をするべきかを理解できなければ、あなたは '適用例。 [LYAH](http://learnyouahaskell.com/functors-applicative-functors-and-monoids)はいつでも簡単に始めることができます。 – leftaroundabout

+0

私はすでにfunahについてのいくつかのことを読んでいます(lyahfggのように)、IO Monad、Maybe Monadのような簡単な(?)ファンクタのfmapの使い方を理解できます。しかし、ここでは、 'String - > Maybe(a、String)'型の関数に関数をマップする必要があります。その場合、これを行う必要性を理解できません(Applicative )。 –

+0

パーサーのファンクターインスタンスは、パーサの最終結果に変換関数を適用するために使用され、基本的に 'パーサa 'を'パーサb'に変更します。 – shang

答えて

2

を私たちはいつものよう

fmap :: (a -> b) -> Parser a -> Parser b 

を定義する必要があり、我々は、パターンマッチングにより開始:

fmap f (Parser p) = _ 

結果は、パーサーも、それでは、コンストラクタを適用させなければならない:

fmap f (Parser p) = Parser _ 

は、今、私たちはString -> Maybe (b, String)、穴内の関数を必要としています。だから1つを作ろう:

fmap f (Parser p) = Parser $ \s -> _ 

これをやりなおしてみましょう。

+0

私は 'String - > Maybe(b、String)'を意味すると思います。 – amalloy

+0

私の実装です。しかし、私はファンクタから何を期待するのか分からないので、私はOKではない: 'インスタンス・ファンクタ・パーサwhere fmap g(Parser f)= Parser f 'where f = case fs 何もない - > Nothing Just(x、ss) - > Just(gx、ss) –

+0

@MaximeB。はい、そうです。 Hackageのクラスのドキュメンテーションを読むことで、 'Functor'から何を期待するかを知ることができます。 – dfeuer

関連する問題