Send Beginners mailing list submissions to
        beginners@haskell.org

To subscribe or unsubscribe via the World Wide Web, visit
        http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
        beginners-requ...@haskell.org

You can reach the person managing the list at
        beginners-ow...@haskell.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."


Today's Topics:

   1.  Type signatures returned with :t (Galaxy Being)
   2. Re:  Type signatures returned with :t (Francesco Ariis)
   3. Re:  Type signatures returned with :t (Galaxy Being)
   4. Re:  Type signatures returned with :t (Erik Dominikus)
   5. Re:  Type signatures returned with :t (Andreas Perstinger)


----------------------------------------------------------------------

Message: 1
Date: Sat, 18 Sep 2021 17:30:17 -0500
From: Galaxy Being <borg...@gmail.com>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <beginners@haskell.org>
Subject: [Haskell-beginners] Type signatures returned with :t
Message-ID:
        <CAFAhFSVtSj_D2y4OkYFz1dAbTxFD4oD8WaE3JCaHEv-e=-p...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

> :t Just True
Just True :: Maybe Bool
> :t Left True
Left True :: Either Bool b
> :t Right False
Right False :: Either a Bool

What am I being told here? It seems

data Maybe a = Just a
             | Nothing
data Either a b = Left a
                | Right b

are both straightforward parameterized types, but Maybe doesn't give me a
type parameter back, while Either does, and in different order, different
names (a becomes b; b becomes a) depending on which variable I invoke. What
deeper lore am I not seeing here?


-- 
⨽
Lawrence Bottorff
Grand Marais, MN, USA
borg...@gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://mail.haskell.org/pipermail/beginners/attachments/20210918/fe39d083/attachment-0001.html>

------------------------------

Message: 2
Date: Sun, 19 Sep 2021 00:41:58 +0200
From: Francesco Ariis <fa...@ariis.it>
To: beginners@haskell.org
Subject: Re: [Haskell-beginners] Type signatures returned with :t
Message-ID: <YUZrNkrUh23OsYse@extensa>
Content-Type: text/plain; charset=utf-8

Il 18 settembre 2021 alle 17:30 Galaxy Being ha scritto:
> > :t Just True
> Just True :: Maybe Bool
> > :t Left True
> Left True :: Either Bool b
> > :t Right False
> Right False :: Either a Bool
> 
> What am I being told here? It seems
> are both straightforward parameterized types, but Maybe doesn't give me a
> type parameter back, while Either does, and in different order, different
> names (a becomes b; b becomes a) depending on which variable I invoke. What
> deeper lore am I not seeing here?

When you ask the type of

    λ> :t Just True

the interpreter *knows* that that `Maybe` is not just a `Maybe a` (so
type constructor and its type parameter) but the /concrete/ type `Maybe
Bool`. This would not be the case if we did

    λ> :t Nothing
    Nothing :: Maybe a

Same story with `Either`. Each of the two data constructors (`Left` and
`Right`) let the interpreter infer just *one* of the type parameters
(the `a` and `b` in `Either a b`).
Does this answer your question?


------------------------------

Message: 3
Date: Sat, 18 Sep 2021 21:19:09 -0500
From: Galaxy Being <borg...@gmail.com>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <beginners@haskell.org>
Subject: Re: [Haskell-beginners] Type signatures returned with :t
Message-ID:
        <cafahfsxht6p+rmyjttpmv92csdj8uctm5mxjxewtsgcftyq...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

Either returns with its parameters, reversed, but Maybe did not. That's my
main question.

On Sat, Sep 18, 2021 at 5:43 PM Francesco Ariis <fa...@ariis.it> wrote:

> Il 18 settembre 2021 alle 17:30 Galaxy Being ha scritto:
> > > :t Just True
> > Just True :: Maybe Bool
> > > :t Left True
> > Left True :: Either Bool b
> > > :t Right False
> > Right False :: Either a Bool
> >
> > What am I being told here? It seems
> > are both straightforward parameterized types, but Maybe doesn't give me a
> > type parameter back, while Either does, and in different order, different
> > names (a becomes b; b becomes a) depending on which variable I invoke.
> What
> > deeper lore am I not seeing here?
>
> When you ask the type of
>
>     λ> :t Just True
>
> the interpreter *knows* that that `Maybe` is not just a `Maybe a` (so
> type constructor and its type parameter) but the /concrete/ type `Maybe
> Bool`. This would not be the case if we did
>
>     λ> :t Nothing
>     Nothing :: Maybe a
>
> Same story with `Either`. Each of the two data constructors (`Left` and
> `Right`) let the interpreter infer just *one* of the type parameters
> (the `a` and `b` in `Either a b`).
> Does this answer your question?
> _______________________________________________
> Beginners mailing list
> Beginners@haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>


-- 
⨽
Lawrence Bottorff
Grand Marais, MN, USA
borg...@gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://mail.haskell.org/pipermail/beginners/attachments/20210918/73fa3562/attachment-0001.html>

------------------------------

Message: 4
Date: Sun, 19 Sep 2021 11:09:37 +0700
From: Erik Dominikus <erik.dominiku...@gmail.com>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <beginners@haskell.org>
Subject: Re: [Haskell-beginners] Type signatures returned with :t
Message-ID:
        <CAOopUj=5_bJ3dPrL2U9bpR3kq9=r24hz7v916k55savdv89...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

> What deeper lore am I not seeing here?

The "deeper lore" you are looking for is:

   - Type variables that look unbound are actually implicitly bound with a
   universal quantifier:
      - "Maybe a" is actually "forall a. Maybe a";
      - "Either a b" is actually "forall a. forall b. Either a b", that is,
      "forall a. (forall b. Either a b)";
      - "Either a (Either b c)" is actually "forall a. forall b. forall c.
      Either a (Either b c)";
      - "a" is actually "forall a. a";
      - "f a" is actually "forall f. forall a. f a".
   - alpha-equivalence: You can rename the bound variables of an expression
   without changing its meaning, as long as you don't change the bindings.
      - Example of changing the bindings: "forall x. forall y. x" (x is
      bound by the first/outer quantifier) is not alpha-equivalent to
"forall y.
      forall x. x" (x is bound by the second/inner quantifier).

Examples of alpha-equivalence (here "≡" reads "is alpha-equivalent to"):

  forall a. forall b. Either a b
≡ forall x. forall y. Either x y
≡ forall b. forall a. Either b a

  forall a. Either Bool a
≡ forall b. Either Bool b
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://mail.haskell.org/pipermail/beginners/attachments/20210919/446aac35/attachment-0001.html>

------------------------------

Message: 5
Date: Sun, 19 Sep 2021 06:46:35 +0200
From: Andreas Perstinger <andiper...@gmail.com>
To: beginners@haskell.org
Subject: Re: [Haskell-beginners] Type signatures returned with :t
Message-ID: <e1185599-8bff-d258-7d8c-8a4d1ee59...@gmail.com>
Content-Type: text/plain; charset=utf-8; format=flowed

On 19.09.21 00:30, Galaxy Being wrote:
>> :t Just True
> Just True :: Maybe Bool

What's the type of `Just`?

 > :t Just
Just :: a -> Maybe a

So `Just` is a constructor function that takes a value of type `a` and 
gives you back a value of type `Maybe a`.

In your example you provide a concrete type for `a` (`True :: Bool`) so 
the type of the result is `Maybe Bool`.

>> :t Left True
> Left True :: Either Bool b

As above what's the type of `Left`?

 > :t Left
Left :: a -> Either a b

Again, `Left` is a constructor function that takes a single value of type 
`a` but now returns a value of type `Either a b`, i.e. it has two type 
variables.

If you specify the type of `a` (again `Bool` in your example), `b` is 
still unspecified/polymorphic and that's why the resulting type is `Either 
Bool b`.

Bye, Andreas


------------------------------

Subject: Digest Footer

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners


------------------------------

End of Beginners Digest, Vol 158, Issue 4
*****************************************

Reply via email to