Summing up all the nodes a tree with a generic type. (Haskell)
I have been trying to write a code which takes all the integers in a tree and return a sum of them. I'm trying to do this with type a
, which is from a data time:
data Tree a = Nil | Value a (Tree a) (Tree a)
deriving Show
and we want to use:tree = Value 2 (Value 2 (Value 2 Nil Nil) Nil) (Value 2 Nil Nil)
and my code is as follow:
countTree :: (a -> a -> a) -> a -> Tree a -> a
countTree p k (Nil) = h
countTree p k (Value x y z) = x (+) (countTree p k y) (+) (countTree p k z)
and I want to run my code as countTree (+) 0 tree
and the results should return 8
.
The problem is that when I run my code it tells me that x
has four arguments but it's type a
has zero which I honestly don't understand why. I've modifying sections of my code, but no success once so ever, I could really use some assistance.
haskell
add a comment |
I have been trying to write a code which takes all the integers in a tree and return a sum of them. I'm trying to do this with type a
, which is from a data time:
data Tree a = Nil | Value a (Tree a) (Tree a)
deriving Show
and we want to use:tree = Value 2 (Value 2 (Value 2 Nil Nil) Nil) (Value 2 Nil Nil)
and my code is as follow:
countTree :: (a -> a -> a) -> a -> Tree a -> a
countTree p k (Nil) = h
countTree p k (Value x y z) = x (+) (countTree p k y) (+) (countTree p k z)
and I want to run my code as countTree (+) 0 tree
and the results should return 8
.
The problem is that when I run my code it tells me that x
has four arguments but it's type a
has zero which I honestly don't understand why. I've modifying sections of my code, but no success once so ever, I could really use some assistance.
haskell
add a comment |
I have been trying to write a code which takes all the integers in a tree and return a sum of them. I'm trying to do this with type a
, which is from a data time:
data Tree a = Nil | Value a (Tree a) (Tree a)
deriving Show
and we want to use:tree = Value 2 (Value 2 (Value 2 Nil Nil) Nil) (Value 2 Nil Nil)
and my code is as follow:
countTree :: (a -> a -> a) -> a -> Tree a -> a
countTree p k (Nil) = h
countTree p k (Value x y z) = x (+) (countTree p k y) (+) (countTree p k z)
and I want to run my code as countTree (+) 0 tree
and the results should return 8
.
The problem is that when I run my code it tells me that x
has four arguments but it's type a
has zero which I honestly don't understand why. I've modifying sections of my code, but no success once so ever, I could really use some assistance.
haskell
I have been trying to write a code which takes all the integers in a tree and return a sum of them. I'm trying to do this with type a
, which is from a data time:
data Tree a = Nil | Value a (Tree a) (Tree a)
deriving Show
and we want to use:tree = Value 2 (Value 2 (Value 2 Nil Nil) Nil) (Value 2 Nil Nil)
and my code is as follow:
countTree :: (a -> a -> a) -> a -> Tree a -> a
countTree p k (Nil) = h
countTree p k (Value x y z) = x (+) (countTree p k y) (+) (countTree p k z)
and I want to run my code as countTree (+) 0 tree
and the results should return 8
.
The problem is that when I run my code it tells me that x
has four arguments but it's type a
has zero which I honestly don't understand why. I've modifying sections of my code, but no success once so ever, I could really use some assistance.
haskell
haskell
asked Nov 10 at 0:18
Li Wang
112
112
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
x (+) (countTree p k y) (+) (countTree p k z)
is attempting to treat x
as a function, and pass to it as arguments all of
(+) (countTree p k y) (+) (countTree p k z)
If you want to have "x + recur left + recur right", you'd want something like:
x + (countTree p k y) + (countTree p k z)
I'm pretty sure however you actually want to use p
, not +
hard coded. Using prefix notation, you'd have to rearrange it a bit to something like :
(p (p x (countTree p k y)) (countTree p k z))
Or, you could use backticks to inline the calls to p
as @bipll suggested:
x `p` (countTree p k y) `p` (countTree p k z)
A side note, but I'm also pretty sure you want h
to be k
.
Or simplyx `p` (countTree p k y) `p` (countTree p k z)
.
– bipll
Nov 10 at 0:45
@bipll Yes. Updated. Thanks.
– Carcigenicate
Nov 10 at 0:47
1
@bipll Oh, and just an FYI, you seem to have escaped your backticks using backslashes. You can put backticks in inlined code by surrounding the code in double backticks. Might be easier of there are a lot of backticks in the code.
– Carcigenicate
Nov 10 at 0:48
1
It’s kind of uncommon, but just as a curiosity, it’s also possible to give a symbolic name to a parameter and then use it as a local operator, e.g.,countTree (%) k (Value x y z) = x % countTree (%) p k y % countTree (%) k z
where%
can be whatever operator name you want. And since the operationp
/(%)
and the base valuek
are repeated on every call, this function also benefits from factoring the recursive bits into a helper function:countTree (%) k = go where go Nil = k; go (Value x y z) = x % go y % go z
– Jon Purdy
Nov 10 at 7:26
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%2f53234898%2fsumming-up-all-the-nodes-a-tree-with-a-generic-type-haskell%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
x (+) (countTree p k y) (+) (countTree p k z)
is attempting to treat x
as a function, and pass to it as arguments all of
(+) (countTree p k y) (+) (countTree p k z)
If you want to have "x + recur left + recur right", you'd want something like:
x + (countTree p k y) + (countTree p k z)
I'm pretty sure however you actually want to use p
, not +
hard coded. Using prefix notation, you'd have to rearrange it a bit to something like :
(p (p x (countTree p k y)) (countTree p k z))
Or, you could use backticks to inline the calls to p
as @bipll suggested:
x `p` (countTree p k y) `p` (countTree p k z)
A side note, but I'm also pretty sure you want h
to be k
.
Or simplyx `p` (countTree p k y) `p` (countTree p k z)
.
– bipll
Nov 10 at 0:45
@bipll Yes. Updated. Thanks.
– Carcigenicate
Nov 10 at 0:47
1
@bipll Oh, and just an FYI, you seem to have escaped your backticks using backslashes. You can put backticks in inlined code by surrounding the code in double backticks. Might be easier of there are a lot of backticks in the code.
– Carcigenicate
Nov 10 at 0:48
1
It’s kind of uncommon, but just as a curiosity, it’s also possible to give a symbolic name to a parameter and then use it as a local operator, e.g.,countTree (%) k (Value x y z) = x % countTree (%) p k y % countTree (%) k z
where%
can be whatever operator name you want. And since the operationp
/(%)
and the base valuek
are repeated on every call, this function also benefits from factoring the recursive bits into a helper function:countTree (%) k = go where go Nil = k; go (Value x y z) = x % go y % go z
– Jon Purdy
Nov 10 at 7:26
add a comment |
x (+) (countTree p k y) (+) (countTree p k z)
is attempting to treat x
as a function, and pass to it as arguments all of
(+) (countTree p k y) (+) (countTree p k z)
If you want to have "x + recur left + recur right", you'd want something like:
x + (countTree p k y) + (countTree p k z)
I'm pretty sure however you actually want to use p
, not +
hard coded. Using prefix notation, you'd have to rearrange it a bit to something like :
(p (p x (countTree p k y)) (countTree p k z))
Or, you could use backticks to inline the calls to p
as @bipll suggested:
x `p` (countTree p k y) `p` (countTree p k z)
A side note, but I'm also pretty sure you want h
to be k
.
Or simplyx `p` (countTree p k y) `p` (countTree p k z)
.
– bipll
Nov 10 at 0:45
@bipll Yes. Updated. Thanks.
– Carcigenicate
Nov 10 at 0:47
1
@bipll Oh, and just an FYI, you seem to have escaped your backticks using backslashes. You can put backticks in inlined code by surrounding the code in double backticks. Might be easier of there are a lot of backticks in the code.
– Carcigenicate
Nov 10 at 0:48
1
It’s kind of uncommon, but just as a curiosity, it’s also possible to give a symbolic name to a parameter and then use it as a local operator, e.g.,countTree (%) k (Value x y z) = x % countTree (%) p k y % countTree (%) k z
where%
can be whatever operator name you want. And since the operationp
/(%)
and the base valuek
are repeated on every call, this function also benefits from factoring the recursive bits into a helper function:countTree (%) k = go where go Nil = k; go (Value x y z) = x % go y % go z
– Jon Purdy
Nov 10 at 7:26
add a comment |
x (+) (countTree p k y) (+) (countTree p k z)
is attempting to treat x
as a function, and pass to it as arguments all of
(+) (countTree p k y) (+) (countTree p k z)
If you want to have "x + recur left + recur right", you'd want something like:
x + (countTree p k y) + (countTree p k z)
I'm pretty sure however you actually want to use p
, not +
hard coded. Using prefix notation, you'd have to rearrange it a bit to something like :
(p (p x (countTree p k y)) (countTree p k z))
Or, you could use backticks to inline the calls to p
as @bipll suggested:
x `p` (countTree p k y) `p` (countTree p k z)
A side note, but I'm also pretty sure you want h
to be k
.
x (+) (countTree p k y) (+) (countTree p k z)
is attempting to treat x
as a function, and pass to it as arguments all of
(+) (countTree p k y) (+) (countTree p k z)
If you want to have "x + recur left + recur right", you'd want something like:
x + (countTree p k y) + (countTree p k z)
I'm pretty sure however you actually want to use p
, not +
hard coded. Using prefix notation, you'd have to rearrange it a bit to something like :
(p (p x (countTree p k y)) (countTree p k z))
Or, you could use backticks to inline the calls to p
as @bipll suggested:
x `p` (countTree p k y) `p` (countTree p k z)
A side note, but I'm also pretty sure you want h
to be k
.
edited Nov 10 at 0:47
answered Nov 10 at 0:28
Carcigenicate
17.2k42957
17.2k42957
Or simplyx `p` (countTree p k y) `p` (countTree p k z)
.
– bipll
Nov 10 at 0:45
@bipll Yes. Updated. Thanks.
– Carcigenicate
Nov 10 at 0:47
1
@bipll Oh, and just an FYI, you seem to have escaped your backticks using backslashes. You can put backticks in inlined code by surrounding the code in double backticks. Might be easier of there are a lot of backticks in the code.
– Carcigenicate
Nov 10 at 0:48
1
It’s kind of uncommon, but just as a curiosity, it’s also possible to give a symbolic name to a parameter and then use it as a local operator, e.g.,countTree (%) k (Value x y z) = x % countTree (%) p k y % countTree (%) k z
where%
can be whatever operator name you want. And since the operationp
/(%)
and the base valuek
are repeated on every call, this function also benefits from factoring the recursive bits into a helper function:countTree (%) k = go where go Nil = k; go (Value x y z) = x % go y % go z
– Jon Purdy
Nov 10 at 7:26
add a comment |
Or simplyx `p` (countTree p k y) `p` (countTree p k z)
.
– bipll
Nov 10 at 0:45
@bipll Yes. Updated. Thanks.
– Carcigenicate
Nov 10 at 0:47
1
@bipll Oh, and just an FYI, you seem to have escaped your backticks using backslashes. You can put backticks in inlined code by surrounding the code in double backticks. Might be easier of there are a lot of backticks in the code.
– Carcigenicate
Nov 10 at 0:48
1
It’s kind of uncommon, but just as a curiosity, it’s also possible to give a symbolic name to a parameter and then use it as a local operator, e.g.,countTree (%) k (Value x y z) = x % countTree (%) p k y % countTree (%) k z
where%
can be whatever operator name you want. And since the operationp
/(%)
and the base valuek
are repeated on every call, this function also benefits from factoring the recursive bits into a helper function:countTree (%) k = go where go Nil = k; go (Value x y z) = x % go y % go z
– Jon Purdy
Nov 10 at 7:26
Or simply
x `p` (countTree p k y) `p` (countTree p k z)
.– bipll
Nov 10 at 0:45
Or simply
x `p` (countTree p k y) `p` (countTree p k z)
.– bipll
Nov 10 at 0:45
@bipll Yes. Updated. Thanks.
– Carcigenicate
Nov 10 at 0:47
@bipll Yes. Updated. Thanks.
– Carcigenicate
Nov 10 at 0:47
1
1
@bipll Oh, and just an FYI, you seem to have escaped your backticks using backslashes. You can put backticks in inlined code by surrounding the code in double backticks. Might be easier of there are a lot of backticks in the code.
– Carcigenicate
Nov 10 at 0:48
@bipll Oh, and just an FYI, you seem to have escaped your backticks using backslashes. You can put backticks in inlined code by surrounding the code in double backticks. Might be easier of there are a lot of backticks in the code.
– Carcigenicate
Nov 10 at 0:48
1
1
It’s kind of uncommon, but just as a curiosity, it’s also possible to give a symbolic name to a parameter and then use it as a local operator, e.g.,
countTree (%) k (Value x y z) = x % countTree (%) p k y % countTree (%) k z
where %
can be whatever operator name you want. And since the operation p
/(%)
and the base value k
are repeated on every call, this function also benefits from factoring the recursive bits into a helper function: countTree (%) k = go where go Nil = k; go (Value x y z) = x % go y % go z
– Jon Purdy
Nov 10 at 7:26
It’s kind of uncommon, but just as a curiosity, it’s also possible to give a symbolic name to a parameter and then use it as a local operator, e.g.,
countTree (%) k (Value x y z) = x % countTree (%) p k y % countTree (%) k z
where %
can be whatever operator name you want. And since the operation p
/(%)
and the base value k
are repeated on every call, this function also benefits from factoring the recursive bits into a helper function: countTree (%) k = go where go Nil = k; go (Value x y z) = x % go y % go z
– Jon Purdy
Nov 10 at 7:26
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.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- 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%2f53234898%2fsumming-up-all-the-nodes-a-tree-with-a-generic-type-haskell%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