Type kind error when creating instance of Functor typeclass
I'm trying to implement Functor
typeclass instance for a very trivial type Foo
:
data Foo a = Foo a
instance functorFoo :: Functor (Foo a) where
map fn (Foo a) = Foo (fn a)
Purescript gives me not-so-helpful error message:
Could not match kind
Type -> Type
with kind
Type
What does it mean? I'm not yet really familiar with the Kind-system.
typeclass functor purescript
add a comment |
I'm trying to implement Functor
typeclass instance for a very trivial type Foo
:
data Foo a = Foo a
instance functorFoo :: Functor (Foo a) where
map fn (Foo a) = Foo (fn a)
Purescript gives me not-so-helpful error message:
Could not match kind
Type -> Type
with kind
Type
What does it mean? I'm not yet really familiar with the Kind-system.
typeclass functor purescript
add a comment |
I'm trying to implement Functor
typeclass instance for a very trivial type Foo
:
data Foo a = Foo a
instance functorFoo :: Functor (Foo a) where
map fn (Foo a) = Foo (fn a)
Purescript gives me not-so-helpful error message:
Could not match kind
Type -> Type
with kind
Type
What does it mean? I'm not yet really familiar with the Kind-system.
typeclass functor purescript
I'm trying to implement Functor
typeclass instance for a very trivial type Foo
:
data Foo a = Foo a
instance functorFoo :: Functor (Foo a) where
map fn (Foo a) = Foo (fn a)
Purescript gives me not-so-helpful error message:
Could not match kind
Type -> Type
with kind
Type
What does it mean? I'm not yet really familiar with the Kind-system.
typeclass functor purescript
typeclass functor purescript
asked Nov 22 '18 at 12:14
Rene SaarsooRene Saarsoo
9,05384567
9,05384567
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
But I'd still like to find out why does the first version not work. Like how does the Functor typeclass differ from e.g. Semigroup where the first version worked just fine.
Let's look at the definition of the Functor
type class:
class Functor f where
map :: forall a b. (a -> b) -> f a -> f b
It contains f a
and f b
types in the type signature of map
which clearly indicates that f
is of kind Type -> Type
(it "carries" another type). On the other hand Semigroup
clearly relates to plain types of kind Type
:
class Semigroup a where
append :: a -> a -> a
So Semigroup
is a class which can be defined for plain types like String
, Int
, List a
, Map k v
or even a function a -> b
(which can also be written as (->) a b
) but not type constructors which require another type like List
Map k
(->) a
(I have to use this notation here).
On the other hand Functor
class requires type constructors so you can have instances like Functor List
, Functor (Map k)
or Functor ((->) a)
.
Thanks for a through explanation. Much appreciated!
– Rene Saarsoo
Nov 23 '18 at 7:43
add a comment |
I found a solution. Instead of defining it as:
instance functorFoo :: Functor (Foo a) where
I need to define it as:
instance functorFoo :: Functor Foo where
But I'd still like to find out why does the first version not work. Like how does the Functor typeclass differ from e.g. Semigroup where the first version worked just fine.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53430790%2ftype-kind-error-when-creating-instance-of-functor-typeclass%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
But I'd still like to find out why does the first version not work. Like how does the Functor typeclass differ from e.g. Semigroup where the first version worked just fine.
Let's look at the definition of the Functor
type class:
class Functor f where
map :: forall a b. (a -> b) -> f a -> f b
It contains f a
and f b
types in the type signature of map
which clearly indicates that f
is of kind Type -> Type
(it "carries" another type). On the other hand Semigroup
clearly relates to plain types of kind Type
:
class Semigroup a where
append :: a -> a -> a
So Semigroup
is a class which can be defined for plain types like String
, Int
, List a
, Map k v
or even a function a -> b
(which can also be written as (->) a b
) but not type constructors which require another type like List
Map k
(->) a
(I have to use this notation here).
On the other hand Functor
class requires type constructors so you can have instances like Functor List
, Functor (Map k)
or Functor ((->) a)
.
Thanks for a through explanation. Much appreciated!
– Rene Saarsoo
Nov 23 '18 at 7:43
add a comment |
But I'd still like to find out why does the first version not work. Like how does the Functor typeclass differ from e.g. Semigroup where the first version worked just fine.
Let's look at the definition of the Functor
type class:
class Functor f where
map :: forall a b. (a -> b) -> f a -> f b
It contains f a
and f b
types in the type signature of map
which clearly indicates that f
is of kind Type -> Type
(it "carries" another type). On the other hand Semigroup
clearly relates to plain types of kind Type
:
class Semigroup a where
append :: a -> a -> a
So Semigroup
is a class which can be defined for plain types like String
, Int
, List a
, Map k v
or even a function a -> b
(which can also be written as (->) a b
) but not type constructors which require another type like List
Map k
(->) a
(I have to use this notation here).
On the other hand Functor
class requires type constructors so you can have instances like Functor List
, Functor (Map k)
or Functor ((->) a)
.
Thanks for a through explanation. Much appreciated!
– Rene Saarsoo
Nov 23 '18 at 7:43
add a comment |
But I'd still like to find out why does the first version not work. Like how does the Functor typeclass differ from e.g. Semigroup where the first version worked just fine.
Let's look at the definition of the Functor
type class:
class Functor f where
map :: forall a b. (a -> b) -> f a -> f b
It contains f a
and f b
types in the type signature of map
which clearly indicates that f
is of kind Type -> Type
(it "carries" another type). On the other hand Semigroup
clearly relates to plain types of kind Type
:
class Semigroup a where
append :: a -> a -> a
So Semigroup
is a class which can be defined for plain types like String
, Int
, List a
, Map k v
or even a function a -> b
(which can also be written as (->) a b
) but not type constructors which require another type like List
Map k
(->) a
(I have to use this notation here).
On the other hand Functor
class requires type constructors so you can have instances like Functor List
, Functor (Map k)
or Functor ((->) a)
.
But I'd still like to find out why does the first version not work. Like how does the Functor typeclass differ from e.g. Semigroup where the first version worked just fine.
Let's look at the definition of the Functor
type class:
class Functor f where
map :: forall a b. (a -> b) -> f a -> f b
It contains f a
and f b
types in the type signature of map
which clearly indicates that f
is of kind Type -> Type
(it "carries" another type). On the other hand Semigroup
clearly relates to plain types of kind Type
:
class Semigroup a where
append :: a -> a -> a
So Semigroup
is a class which can be defined for plain types like String
, Int
, List a
, Map k v
or even a function a -> b
(which can also be written as (->) a b
) but not type constructors which require another type like List
Map k
(->) a
(I have to use this notation here).
On the other hand Functor
class requires type constructors so you can have instances like Functor List
, Functor (Map k)
or Functor ((->) a)
.
edited Nov 24 '18 at 23:03
answered Nov 22 '18 at 22:36
paluhpaluh
1,5711511
1,5711511
Thanks for a through explanation. Much appreciated!
– Rene Saarsoo
Nov 23 '18 at 7:43
add a comment |
Thanks for a through explanation. Much appreciated!
– Rene Saarsoo
Nov 23 '18 at 7:43
Thanks for a through explanation. Much appreciated!
– Rene Saarsoo
Nov 23 '18 at 7:43
Thanks for a through explanation. Much appreciated!
– Rene Saarsoo
Nov 23 '18 at 7:43
add a comment |
I found a solution. Instead of defining it as:
instance functorFoo :: Functor (Foo a) where
I need to define it as:
instance functorFoo :: Functor Foo where
But I'd still like to find out why does the first version not work. Like how does the Functor typeclass differ from e.g. Semigroup where the first version worked just fine.
add a comment |
I found a solution. Instead of defining it as:
instance functorFoo :: Functor (Foo a) where
I need to define it as:
instance functorFoo :: Functor Foo where
But I'd still like to find out why does the first version not work. Like how does the Functor typeclass differ from e.g. Semigroup where the first version worked just fine.
add a comment |
I found a solution. Instead of defining it as:
instance functorFoo :: Functor (Foo a) where
I need to define it as:
instance functorFoo :: Functor Foo where
But I'd still like to find out why does the first version not work. Like how does the Functor typeclass differ from e.g. Semigroup where the first version worked just fine.
I found a solution. Instead of defining it as:
instance functorFoo :: Functor (Foo a) where
I need to define it as:
instance functorFoo :: Functor Foo where
But I'd still like to find out why does the first version not work. Like how does the Functor typeclass differ from e.g. Semigroup where the first version worked just fine.
answered Nov 22 '18 at 12:22
Rene SaarsooRene Saarsoo
9,05384567
9,05384567
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53430790%2ftype-kind-error-when-creating-instance-of-functor-typeclass%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown