oldk1331 wrote:
> 
> There's a long thread in 2011 talking about monad,
> but that discussion is not very clear and not what
> I am going to talk about.
> https://groups.google.com/d/msg/fricas-devel/UCFkQGgOOf0/oj9-FygocVgJ
> 
> The motivation get me into this topic is simple:
> In OpenAxiom, I see there's a Maybe domain instead
> of Union(T, "failed").  I want to have Maybe in FriCAS.
> 
> However, unlike Haskell, Maybe in OpenAxiom is not
> a Monad.
> 
> So I did some research about how to implement Monad
> in FriCAS:
> 
> ## Functor
> First, a simpler concept, Functor.  OpenAxiom has this
> Category defined, basicly, exports 'map(S->S, %)->%'.
> 
> I think FriCAS should also use this Categoty, ")dis op map" gives
> 81 exposed and 15 unexposed signature, that's too messy.
> 
> This Functor category is easy to understand, but it can't
> handle more than 2 types:
>     map : (A->B, Functor A) : Functor B
> It is impossible to export this signature in a category, and I use
> a "hacky" method to implement it, see FunctorPackage bellow.
> 
> ## Maybe
> Maybe is an abstraction over Union(T, "failed"), but it also has
> some property: Maybe is a Functor and a Monad.
> 
> See the implementation of "map" in Maybe and FunctorPackage.
> 
> ## Monad
> Functor is a category exports map : (S -> S, %) -> %,
> Monad is a category exports bind : (S -> %, %) -> %,
> or its infix form          (% >>= (S -> %)) : %
> 
> For more than 2 types,
>         bind : (A -> Monad B, Monad A) -> Monad B
>         >>= : (Monad A, A -> Monad B) -> Monad B
> 
> It seems that FriCAS doesn't support infix operator with
> 3 letters, I use "_>_>" in the code bellow.

Well, FriCAS lexer has fixed set non-alphabetic tokens and '>>='
is not one but two tokens ('>>' followed by '=').

> ## Usage
> This is just a simple example:
> 
> myinv(x:FRAC INT):Maybe FRAC INT == if x = 0 then nothing()$Maybe(FRAC
> INT) else just(1/x)
> 
> (3) -> myinv 4
> 
>         1
>    (3)  â  
>         4
>                                                Type: Maybe(Fraction(Integer))
> (4) -> myinv 0
> 
>    (4)  ()
>                                                Type: Maybe(Fraction(Integer))
> (5) -> myinv 4 >> myinv
> 
>    (5)  4
>                                                Type: Maybe(Fraction(Integer))
> (6) -> myinv 0 >> myinv
> 
>    (6)  ()
>                                                Type: Maybe(Fraction(Integer))
> 
> Compared with:
> (7) -> inv 4
> 
>         1
>    (7)  â  
>         4
>                                                       Type: Fraction(Integer)
> (8) -> inv inv 4
> 
>    (8)  4
>                                                       Type: Fraction(Integer)
> (9) -> inv inv 0
> 
>    >> Error detected within library code:
>    not invertible
> 
> ##
> 
> This is just a "proof of concept" version, you can see the
> Haskell version of Maybe from here:
> https://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Maybe.html
> 
> So, do you support implement such Functor/Monad/Maybe
> in FriCAS?

I do not understand why you want this.  One problem is length
of 'Union(Something, "failed")', but we can use macros like:

Maybe(T) ==> Union(T, "failed")

UF(T) ==> Union(T, "failed")

or

UF1 ==> Union(Something, "failed")

You seem to want to use '>>' to convert functions from
T to Union(T, "failed") into functions from
Union(T, "failed") to Union(T, "failed").  I am not sure
if this will work well: currently both Spad compiler and
interpteter have very limited ability to "invent" new
types.  Actually Spad compiler need some explicit or
implicit import to use a type.  Interpeter has a bunch
of hardcoded rules, go beyond them and it can not
find type.  So there is good chance that you will have
to explicitely import your packages/domains for all
involved T-s.

Also, Spad compiler knows about unions, so we can use
code like:

    ru := retractIfCan(x)@Union(T, "failed")
    ru case "failed" => "failed"
    r := ru::T

and Spad compiler knows that coercion in third line is legit,
because we excluded the other possibility in line 2.  With
'Maybe' compiler will no longer accept code like above.  Of course
you may add explicit functions to test for failure and explicit
function for coercion which calls error if value is not T, but
then you loose static checking: once you add such coercion you
can call it without performing check before.

-- 
                              Waldek Hebisch

-- 
You received this message because you are subscribed to the Google Groups 
"FriCAS - computer algebra system" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to fricas-devel+unsubscr...@googlegroups.com.
To post to this group, send email to fricas-devel@googlegroups.com.
Visit this group at https://groups.google.com/group/fricas-devel.
For more options, visit https://groups.google.com/d/optout.

Reply via email to