How can I sum the middle elements of an expanding list in Haskell?
So far I know how to expand a list from its ends, but they end up getting doubled because of the first condition, which is to double a singleton. Would it make sense for the code to be like this:
sumExpand :: [Integer] -> [Integer]
sumExpand l = expand l
where
expand a = a
expand (x:) a = x: expand (x:a)
expand (x:xs) a = expand (x:a) (expand xs a)
And for me to work on its output:
[1,1,2,2,3,3] from [1,2,3]
instead of [1,3,5,3]
The latter being my desire? Here's how I got to a temporary solution for a list of two elements:
expand (x:xs) a = x: tail (expand (map (x+) xs) (last xs:a))
Output:
*Main> sumExpand [1,2]
[1,3,2]
*Main> sumExpand [1,2,3]
[1,7,4,3]
EDIT: basically, I want the algorithm to work like this: [a, b, c] => [a, a+b, b+c, c]
list haskell sum expand
add a comment |
So far I know how to expand a list from its ends, but they end up getting doubled because of the first condition, which is to double a singleton. Would it make sense for the code to be like this:
sumExpand :: [Integer] -> [Integer]
sumExpand l = expand l
where
expand a = a
expand (x:) a = x: expand (x:a)
expand (x:xs) a = expand (x:a) (expand xs a)
And for me to work on its output:
[1,1,2,2,3,3] from [1,2,3]
instead of [1,3,5,3]
The latter being my desire? Here's how I got to a temporary solution for a list of two elements:
expand (x:xs) a = x: tail (expand (map (x+) xs) (last xs:a))
Output:
*Main> sumExpand [1,2]
[1,3,2]
*Main> sumExpand [1,2,3]
[1,7,4,3]
EDIT: basically, I want the algorithm to work like this: [a, b, c] => [a, a+b, b+c, c]
list haskell sum expand
1
What precisely is your algorithm supposed to do? What are you having trouble with?
– jberryman
Nov 20 '18 at 17:01
You want to insert the sum of each adjacent pair between the pair?[a, b, c] => [a, a+b, b, b + c, c]
?
– chepner
Nov 20 '18 at 17:17
What I want to do is the following:[a, b, c] => [a, a+b, b+c, c]
. It's basically the same as what @chepner suggested, but without b repeating itself.
– Marco_O
Nov 20 '18 at 17:30
1
How about more than 3 elements in list? say, [a, b, c, d] => [a, a+b, b+c, c+d, d]?
– assembly.jc
Nov 20 '18 at 17:44
I have the solution, but could you give me any pointers on how to improve my research or problem solving skills, for when stuff like this happens? I just got down voted and I want to improve. Thanks in advance.
– Marco_O
Nov 20 '18 at 18:07
add a comment |
So far I know how to expand a list from its ends, but they end up getting doubled because of the first condition, which is to double a singleton. Would it make sense for the code to be like this:
sumExpand :: [Integer] -> [Integer]
sumExpand l = expand l
where
expand a = a
expand (x:) a = x: expand (x:a)
expand (x:xs) a = expand (x:a) (expand xs a)
And for me to work on its output:
[1,1,2,2,3,3] from [1,2,3]
instead of [1,3,5,3]
The latter being my desire? Here's how I got to a temporary solution for a list of two elements:
expand (x:xs) a = x: tail (expand (map (x+) xs) (last xs:a))
Output:
*Main> sumExpand [1,2]
[1,3,2]
*Main> sumExpand [1,2,3]
[1,7,4,3]
EDIT: basically, I want the algorithm to work like this: [a, b, c] => [a, a+b, b+c, c]
list haskell sum expand
So far I know how to expand a list from its ends, but they end up getting doubled because of the first condition, which is to double a singleton. Would it make sense for the code to be like this:
sumExpand :: [Integer] -> [Integer]
sumExpand l = expand l
where
expand a = a
expand (x:) a = x: expand (x:a)
expand (x:xs) a = expand (x:a) (expand xs a)
And for me to work on its output:
[1,1,2,2,3,3] from [1,2,3]
instead of [1,3,5,3]
The latter being my desire? Here's how I got to a temporary solution for a list of two elements:
expand (x:xs) a = x: tail (expand (map (x+) xs) (last xs:a))
Output:
*Main> sumExpand [1,2]
[1,3,2]
*Main> sumExpand [1,2,3]
[1,7,4,3]
EDIT: basically, I want the algorithm to work like this: [a, b, c] => [a, a+b, b+c, c]
list haskell sum expand
list haskell sum expand
edited Nov 20 '18 at 17:34
Marco_O
asked Nov 20 '18 at 16:52
Marco_OMarco_O
167
167
1
What precisely is your algorithm supposed to do? What are you having trouble with?
– jberryman
Nov 20 '18 at 17:01
You want to insert the sum of each adjacent pair between the pair?[a, b, c] => [a, a+b, b, b + c, c]
?
– chepner
Nov 20 '18 at 17:17
What I want to do is the following:[a, b, c] => [a, a+b, b+c, c]
. It's basically the same as what @chepner suggested, but without b repeating itself.
– Marco_O
Nov 20 '18 at 17:30
1
How about more than 3 elements in list? say, [a, b, c, d] => [a, a+b, b+c, c+d, d]?
– assembly.jc
Nov 20 '18 at 17:44
I have the solution, but could you give me any pointers on how to improve my research or problem solving skills, for when stuff like this happens? I just got down voted and I want to improve. Thanks in advance.
– Marco_O
Nov 20 '18 at 18:07
add a comment |
1
What precisely is your algorithm supposed to do? What are you having trouble with?
– jberryman
Nov 20 '18 at 17:01
You want to insert the sum of each adjacent pair between the pair?[a, b, c] => [a, a+b, b, b + c, c]
?
– chepner
Nov 20 '18 at 17:17
What I want to do is the following:[a, b, c] => [a, a+b, b+c, c]
. It's basically the same as what @chepner suggested, but without b repeating itself.
– Marco_O
Nov 20 '18 at 17:30
1
How about more than 3 elements in list? say, [a, b, c, d] => [a, a+b, b+c, c+d, d]?
– assembly.jc
Nov 20 '18 at 17:44
I have the solution, but could you give me any pointers on how to improve my research or problem solving skills, for when stuff like this happens? I just got down voted and I want to improve. Thanks in advance.
– Marco_O
Nov 20 '18 at 18:07
1
1
What precisely is your algorithm supposed to do? What are you having trouble with?
– jberryman
Nov 20 '18 at 17:01
What precisely is your algorithm supposed to do? What are you having trouble with?
– jberryman
Nov 20 '18 at 17:01
You want to insert the sum of each adjacent pair between the pair?
[a, b, c] => [a, a+b, b, b + c, c]
?– chepner
Nov 20 '18 at 17:17
You want to insert the sum of each adjacent pair between the pair?
[a, b, c] => [a, a+b, b, b + c, c]
?– chepner
Nov 20 '18 at 17:17
What I want to do is the following:
[a, b, c] => [a, a+b, b+c, c]
. It's basically the same as what @chepner suggested, but without b repeating itself.– Marco_O
Nov 20 '18 at 17:30
What I want to do is the following:
[a, b, c] => [a, a+b, b+c, c]
. It's basically the same as what @chepner suggested, but without b repeating itself.– Marco_O
Nov 20 '18 at 17:30
1
1
How about more than 3 elements in list? say, [a, b, c, d] => [a, a+b, b+c, c+d, d]?
– assembly.jc
Nov 20 '18 at 17:44
How about more than 3 elements in list? say, [a, b, c, d] => [a, a+b, b+c, c+d, d]?
– assembly.jc
Nov 20 '18 at 17:44
I have the solution, but could you give me any pointers on how to improve my research or problem solving skills, for when stuff like this happens? I just got down voted and I want to improve. Thanks in advance.
– Marco_O
Nov 20 '18 at 18:07
I have the solution, but could you give me any pointers on how to improve my research or problem solving skills, for when stuff like this happens? I just got down voted and I want to improve. Thanks in advance.
– Marco_O
Nov 20 '18 at 18:07
add a comment |
1 Answer
1
active
oldest
votes
Basically, all you want to compute component-wise sums between your input list and a shifted version of it:
a b c d e
a b c d e
---------------------------
a a+b b+c c+d d+e e
Fill each empty slot with a 0 (0:x
and x++[0]
), and you just need zipWith
> x -> zipWith (+) (0:x) (x++[0]) $ [1,2,3]
[1,3,5,3]
Thank you! That's very useful. Now I have something to study its meaning.
– Marco_O
Nov 20 '18 at 17:50
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%2f53397811%2fhow-can-i-sum-the-middle-elements-of-an-expanding-list-in-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
Basically, all you want to compute component-wise sums between your input list and a shifted version of it:
a b c d e
a b c d e
---------------------------
a a+b b+c c+d d+e e
Fill each empty slot with a 0 (0:x
and x++[0]
), and you just need zipWith
> x -> zipWith (+) (0:x) (x++[0]) $ [1,2,3]
[1,3,5,3]
Thank you! That's very useful. Now I have something to study its meaning.
– Marco_O
Nov 20 '18 at 17:50
add a comment |
Basically, all you want to compute component-wise sums between your input list and a shifted version of it:
a b c d e
a b c d e
---------------------------
a a+b b+c c+d d+e e
Fill each empty slot with a 0 (0:x
and x++[0]
), and you just need zipWith
> x -> zipWith (+) (0:x) (x++[0]) $ [1,2,3]
[1,3,5,3]
Thank you! That's very useful. Now I have something to study its meaning.
– Marco_O
Nov 20 '18 at 17:50
add a comment |
Basically, all you want to compute component-wise sums between your input list and a shifted version of it:
a b c d e
a b c d e
---------------------------
a a+b b+c c+d d+e e
Fill each empty slot with a 0 (0:x
and x++[0]
), and you just need zipWith
> x -> zipWith (+) (0:x) (x++[0]) $ [1,2,3]
[1,3,5,3]
Basically, all you want to compute component-wise sums between your input list and a shifted version of it:
a b c d e
a b c d e
---------------------------
a a+b b+c c+d d+e e
Fill each empty slot with a 0 (0:x
and x++[0]
), and you just need zipWith
> x -> zipWith (+) (0:x) (x++[0]) $ [1,2,3]
[1,3,5,3]
answered Nov 20 '18 at 17:48
chepnerchepner
246k32233324
246k32233324
Thank you! That's very useful. Now I have something to study its meaning.
– Marco_O
Nov 20 '18 at 17:50
add a comment |
Thank you! That's very useful. Now I have something to study its meaning.
– Marco_O
Nov 20 '18 at 17:50
Thank you! That's very useful. Now I have something to study its meaning.
– Marco_O
Nov 20 '18 at 17:50
Thank you! That's very useful. Now I have something to study its meaning.
– Marco_O
Nov 20 '18 at 17:50
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%2f53397811%2fhow-can-i-sum-the-middle-elements-of-an-expanding-list-in-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
1
What precisely is your algorithm supposed to do? What are you having trouble with?
– jberryman
Nov 20 '18 at 17:01
You want to insert the sum of each adjacent pair between the pair?
[a, b, c] => [a, a+b, b, b + c, c]
?– chepner
Nov 20 '18 at 17:17
What I want to do is the following:
[a, b, c] => [a, a+b, b+c, c]
. It's basically the same as what @chepner suggested, but without b repeating itself.– Marco_O
Nov 20 '18 at 17:30
1
How about more than 3 elements in list? say, [a, b, c, d] => [a, a+b, b+c, c+d, d]?
– assembly.jc
Nov 20 '18 at 17:44
I have the solution, but could you give me any pointers on how to improve my research or problem solving skills, for when stuff like this happens? I just got down voted and I want to improve. Thanks in advance.
– Marco_O
Nov 20 '18 at 18:07