On 13-08-22 04:04 PM, Petr Pudlák wrote:
Or, if there are no such definitions, where would be a good place to add
them?

If they are to be added to the base libraries, the Data.Monoid module would be my choice.

I did wish I had the AppMonoid instance on several occasions, when using various parser combinator libraries that don't support this reasonable instance of Monoid:

>   numericLiteral = optionalMonoid (string "+" <|> string "-")
>                    <> some digit
>                    <> optionalMonoid (string "." <> some digit)


The problem is, the AppMonoid newtype would not help in that situation unless it also implemented Applicative and Alternative class, as well as the parsing primitives. Without the latter, the above code would look like this:


>   numericLiteral = optionalMonoid
                        (AppMonoid (string "+" <|> string "-"))
>                    <> some (AppMonoid digit)
>                    <> optionalMonoid (AppMonoid (string ".")
>                                       <> some (AppMonoid digit))


The point of the above is that I don't think there is enough justification for these newtypes. The Applicative and Alternative instances are typically used because of the primitives they come with, and newtype wrappings like AppMonoid and AltMonoid can't support those easily. Unless ekmett adds the appropriate instances to his parsers package, they would be too clumsy to use.



Petr

Dne 08/20/2013 06:55 PM, Petr Pudlák napsal(a):

Dear Haskellers,

are these monoids defined somewhere?

|import  Control.Applicative
import  Data.Monoid

newtype  AppMonoid  m a =AppMonoid  (m  a)
instance  (Monoid  a,Applicative  m) =>Monoid  (AppMonoid  m a)where
     mempty =AppMonoid  $ pure mempty
     mappend (AppMonoid  x) (AppMonoid  y) =AppMonoid  $ mappend <$> x <*> y
-- With the () monoid for `a` this becames the monoid of effects.

newtype  AltMonoid  m a =AltMonoid  (m  a)
instance  Alternative  m =>Monoid  (AltMonoid  m a)where
     mempty =AltMonoid  empty
     mappend (AltMonoid  x) (AltMonoid  y) =AltMonoid  $ x <|> y|

(and similarly for Monad/MonadPlus, until they become subclasses of
Applicative?)

Best regards,
Petr




_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe



_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to