Send Beginners mailing list submissions to
[email protected]
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
[email protected]
You can reach the person managing the list at
[email protected]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."
Today's Topics:
1. Type declarations (Patrik Iselind)
2. Re: Type declarations (Francesco Ariis)
3. Re: Type declarations (mrx)
4. Re: Type declarations (Francesco Ariis)
5. Re: Type declarations (Patrik Iselind)
6. Re: Why do i need to specify the class of a here at all?
(Quentin Liu)
----------------------------------------------------------------------
Message: 1
Date: Sun, 26 Nov 2017 14:50:30 +0100
From: Patrik Iselind <[email protected]>
To: [email protected]
Subject: [Haskell-beginners] Type declarations
Message-ID: <[email protected]>
Content-Type: text/plain; charset=windows-1252; format=flowed
Hi,
What's the difference between `delta :: (Point t) => t -> t -> Double`
and `delta :: Point p -> Point q -> Double`. The later one is accepted
by GHCI when i do :load.
As i see it the first one would make better sense to me. I want two
Point as in-parameters and delta will produce a Double, but GHCI refuse
this saying
```
nine.hs:10:11:
Expected a constraint, but ‘Point t’ has kind ‘*’
In the type signature for ‘delta’:
delta :: (Point t) => t -> t -> Double
Failed, modules loaded: none.
```
Is this saying that Point t match 'everything' (*)?
In the second version, which is accepted by GHCI, i don't see the point
of p and q. Can i use these somehow?
All of delta using the accepted type declaration looks like this for
reference:
```
data Direction d = LEFT
| RIGHT
| STRAIGHT
deriving (Show)
data Point a = Coordinate Double Double
deriving (Show)
-- Calculate the slope between two points (dy/dx)
delta :: Point p -> Point q -> Double
delta (Coordinate a b) (Coordinate c d)
| (a == c) = 0
| otherwise = (d-b)/(c-a)
angle (Coordinate g h) (Coordinate i d) (Coordinate e f)
| (delta a b) > (delta b c) = RIGHT
| (delta a b) < (delta b c) = LEFT
| otherwise = STRAIGHT
where a = Coordinate g h
b = Coordinate i d
c = Coordinate e f
```
I'm also wondering if there is a simpler way than recreating the
Coordinate as a, b, and c in angle. It seems to work ok to me, i just
feel that a, b, and c in angle should be possible to express in a better
way.
--
Patrik Iselind
------------------------------
Message: 2
Date: Sun, 26 Nov 2017 15:07:36 +0100
From: Francesco Ariis <[email protected]>
To: [email protected]
Subject: Re: [Haskell-beginners] Type declarations
Message-ID: <[email protected]>
Content-Type: text/plain; charset=iso-8859-1
On Sun, Nov 26, 2017 at 02:50:30PM +0100, Patrik Iselind wrote:
> Hi,
>
> What's the difference between `delta :: (Point t) => t -> t -> Double` and
> `delta :: Point p -> Point q -> Double`. The later one is accepted by GHCI
> when i do :load.
Hello Patrik,
`delta :: (Point t) => t -> t -> Double` means Point is a typeclass
and t is an instance of a typeclass.
In your case point is a datatype (data Point a etc. etc.) so the second
signature is the correct one.
> In the second version, which is accepted by GHCI, i don't see the point of p
> and q. Can i use these somehow?
`p` and `q` are the parameter of `Point a`, but since the definition
of Point is:
data Point a = Coordinate Double Double
deriving (Show)
that `a` most likely has... no point (ueueuee pardon the pun) and would
better be written as
data Point = Coordinate Double Double
deriving (Show)
Does this make sense?
------------------------------
Message: 3
Date: Sun, 26 Nov 2017 19:02:36 +0100
From: mrx <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] Type declarations
Message-ID:
<canzojbjxhzxjecev3k8vjbj6aurxxt0jt+lpsgi8whg9tak...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"
Den 26 nov 2017 15:08 skrev "Francesco Ariis" <[email protected]>:
On Sun, Nov 26, 2017 at 02:50:30PM +0100, Patrik Iselind wrote:
> Hi,
>
> What's the difference between `delta :: (Point t) => t -> t -> Double` and
> `delta :: Point p -> Point q -> Double`. The later one is accepted by GHCI
> when i do :load.
Hello Patrik,
`delta :: (Point t) => t -> t -> Double` means Point is a typeclass
and t is an instance of a typeclass.
In your case point is a datatype (data Point a etc. etc.) so the second
signature is the correct one.
> In the second version, which is accepted by GHCI, i don't see the point
of p
> and q. Can i use these somehow?
`p` and `q` are the parameter of `Point a`,
What do you mean by parameter of Point a?
but since the definition
of Point is:
data Point a = Coordinate Double Double
deriving (Show)
that `a` most likely has... no point (ueueuee pardon the pun) and would
better be written as
data Point = Coordinate Double Double
deriving (Show)
Does this make sense?
I think I'll have to chew that until I reach the chapter on type classes in
real world haskell. Hopefully I'll get it then.
Do you think it would be a mistake to simply skip writing the type
declarations completely until I've reached type classes?
// Patrik
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://mail.haskell.org/pipermail/beginners/attachments/20171126/e57105aa/attachment-0001.html>
------------------------------
Message: 4
Date: Sun, 26 Nov 2017 19:20:16 +0100
From: Francesco Ariis <[email protected]>
To: [email protected]
Subject: Re: [Haskell-beginners] Type declarations
Message-ID: <[email protected]>
Content-Type: text/plain; charset=us-ascii
On Sun, Nov 26, 2017 at 07:02:36PM +0100, mrx wrote:
> What do you mean by parameter of Point a?
Let's start with a type you probably know, Maybe:
data Maybe a = Just a
| Nothing
The `a` in `Maybe a` is a type parameter, as the whole thing can
be a `Maybe Int`, `Maybe String`, etc.
Now let's check what `Point a` does
data Point a = Coordinate Double Double
Uhhh, suspicious, there is an `a` on the left side, but it's pretty
useless, because there is no `a` on the right side. This is
most likely not correct. Better to write
-- this, concrete
data Point = Coordinate Double Double
-- or parametric
data Point a = Coordinate a a
> Do you think it would be a mistake to simply skip writing the type
> declarations completely until I've reached type classes?
As now you know how write signatures like `something :: Int -> [String]`,
when you meet `Something a => etc.` tread with care until you reach
the chapter on typeclasses.
------------------------------
Message: 5
Date: Sun, 26 Nov 2017 19:39:49 +0100
From: Patrik Iselind <[email protected]>
To: [email protected]
Subject: Re: [Haskell-beginners] Type declarations
Message-ID: <[email protected]>
Content-Type: text/plain; charset=utf-8; format=flowed
Den 2017-11-26 kl. 19:20, skrev Francesco Ariis:
> On Sun, Nov 26, 2017 at 07:02:36PM +0100, mrx wrote:
>> What do you mean by parameter of Point a?
> Let's start with a type you probably know, Maybe:
>
> data Maybe a = Just a
> | Nothing
Sorry, i've not used Maybe yet. Chapter 3 that i'm trying to get through
now mention a Maybe ever so briefly. I've heard of a Maybe monad, is
that it?
> The `a` in `Maybe a` is a type parameter, as the whole thing can
> be a `Maybe Int`, `Maybe String`, etc.
>
> Now let's check what `Point a` does
>
> data Point a = Coordinate Double Double
>
> Uhhh, suspicious, there is an `a` on the left side, but it's pretty
> useless, because there is no `a` on the right side. This is
> most likely not correct.
Ah, i see. Thanks for the clarification.
> Better to write
>
> -- this, concrete
> data Point = Coordinate Double Double
> -- or parametric
> data Point a = Coordinate a a
Does this mean that i can write `delta :: Point Double t -> Point Double
t -> Direction d` as a type declaration. Then i would require
`Coordinate Double Double` as in parameters. Correct?
>> Do you think it would be a mistake to simply skip writing the type
>> declarations completely until I've reached type classes?
> As now you know how write signatures like `something :: Int -> [String]`,
> when you meet `Something a => etc.` tread with care until you reach
> the chapter on typeclasses.
When i write type declarations, then i should stick with the non-`(Foo
f) =>` version until i've reached that chapter on type classes. It's
stilla few chapters until i reach it, i'm on chapter 3 and type classes
are chapter 6.
// Patrik
------------------------------
Message: 6
Date: Sun, 26 Nov 2017 14:48:22 -0500
From: Quentin Liu <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] Why do i need to specify the class of
a here at all?
Message-ID: <883dc5c3-2c67-4c9c-a71a-cab090337426@Spark>
Content-Type: text/plain; charset="utf-8"
> ```
> exercises.hs:33:13:
> Couldn't match expected type ‘[b0]’ with actual type ‘a’
> ‘a’ is a rigid type variable bound by
> the type signature for myOrderFunc :: a -> a -> Ordering
> at exercises.hs:31:16
> Relevant bindings include
> y :: a (bound at exercises.hs:32:15)
> x :: a (bound at exercises.hs:32:13)
> myOrderFunc :: a -> a -> Ordering (bound at exercises.hs:32:1)
> In the first argument of ‘myLen’, namely ‘x’
> In the first argument of ‘(<)’, namely ‘myLen x’
> Failed, modules loaded: none.
> ```
Your guess is correct. The problem is, Haskell does not consider `a` in
`myOrderFunc` and `[b]` in `myLen` equivalent. `a` means you feed the function
any type, while `[b]` means it must be a list of values of the same type. So
changing `a` to `[a]` woud eliminate the error.
Regards,
Qingbo Liu
On Nov 24, 2017, 16:33 -0500, Patrik Iselind <[email protected]>, wrote:
>
> Den 2017-11-24 kl. 20:04, skrev Quentin Liu:
> >
> > > > > Yes, you could pass the function a list of strings as well. A string
> > > > > is just a list of Chars. The type signature `a` does not restrict the
> > > > > range of types you could pass to the function.
> > > >
> > > > That seem strange to me. Wouldn't that mean that i could write the
> > > > declaration of myOrderFunc as `myOrderFunc :: a -> a -> Ordering` as
> > > > well? GHCI give me an error on this though so obviously it's wrong. I
> > > > just don't see why. Why cannot a represent [b]?
> >
> > Could you copy and paste the error message here?
> Sure, the error i get follows
> ```
> exercises.hs:33:13:
> Couldn't match expected type ‘[b0]’ with actual type ‘a’
> ‘a’ is a rigid type variable bound by
> the type signature for myOrderFunc :: a -> a -> Ordering
> at exercises.hs:31:16
> Relevant bindings include
> y :: a (bound at exercises.hs:32:15)
> x :: a (bound at exercises.hs:32:13)
> myOrderFunc :: a -> a -> Ordering (bound at exercises.hs:32:1)
> In the first argument of ‘myLen’, namely ‘x’
> In the first argument of ‘(<)’, namely ‘myLen x’
> Failed, modules loaded: none.
> ```
> Attaching the updated exercises.hs for reference.
>
> I'm still not very good at interpreting Haskell's error messages, they are
> quite cryptic to me. My interpretation/guess of the above is that my `a` is
> too 'wide' or how you express it. Haskell seem to expect some form of list.
> Most likely since i want a length and lists are perhaps everything in Haskell
> that can produce a length. I've hardly scratched the surface of what i
> imagine is Haskell so i cannot say anything for sure yet.
>
> >
> > The way I use to think about type signature is, when you trying to
> > substitute type variables such as `a`, substitute it into a concrete type
> > that you are working with.
> I'm having a hard time understanding your way of thinking about type
> signatures. Could you perhaps elaborate a bit more on it?
>
> // Patrik
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://mail.haskell.org/pipermail/beginners/attachments/20171126/dd685676/attachment.html>
------------------------------
Subject: Digest Footer
_______________________________________________
Beginners mailing list
[email protected]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
------------------------------
End of Beginners Digest, Vol 113, Issue 26
******************************************