2

I'm trying to declare MonadPlus interface like that:

module NanoParsec.Plus

%access public export

interface Monad m => MonadPlus m where
    zero : m a
    plus : m a -> m a -> m a

But have an error:

  |
5 | interface Monad m => MonadPlus m where
  |           ~~~~~~~
When checking type of constructor of NanoParsec.Plus.MonadPlus#Monad m:
When checking argument m to type constructor Prelude.Monad.Monad:
        Type mismatch between
                Type (Type of m)
        and
                Type -> Type (Expected type)

What I'm doing wrong? How to fix this? Am I right that Idris has no its own MonadPlus interface? If so, why?

joel
  • 6,359
  • 2
  • 30
  • 55
ChessMax
  • 2,125
  • 1
  • 16
  • 16

1 Answers1

2

In Idris, when you define an interface, the parameter type defaults to Type, so MonadPlus m here is short for MonadPlus (m: Type), and Idris treats m as a Type. This of course doesn't fit with the constraint Monad m, which expects a Type -> Type.

You have to be explicit if you want to parametrize over something else, like

interface Monad m => MonadPlus (m: Type -> Type) where
    zero : m a
    plus : m a -> m a -> m a

MonadPlus itself is beyond my knowledge so I don't know about its presence, or lack thereof, in Idris.

joel
  • 6,359
  • 2
  • 30
  • 55