How to proper read this SML function that uses foldl? Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) Data science time! April 2019 and salary with experience The Ask Question Wizard is Live!How do you print inside a case statement in SML?SML Function Argument Pattern MatchingSML - Incrementing a value in a tuple during foldl that needs to be returnedImplementing Radix Sort in SMLSignature of higher order functions in SMLError: Operator is not a function - SMLHow to acess argument from a function passed as argument in SMLWhy am I getting “unbound variable or constructor” in my SML programUsing records as function arguments in SMLWhat is error of unresolved flex record in SML?
Delete free apps from library
Sally's older brother
Why is it faster to reheat something than it is to cook it?
Rationale for describing kurtosis as "peakedness"?
Why is the change of basis formula counter-intuitive? [See details]
What initially awakened the Balrog?
Did pre-Columbian Americans know the spherical shape of the Earth?
Why is a lens darker than other ones when applying the same settings?
Why weren't discrete x86 CPUs ever used in game hardware?
How does light 'choose' between wave and particle behaviour?
Asymptotics question
How many time has Arya actually used Needle?
Why not send Voyager 3 and 4 following up the paths taken by Voyager 1 and 2 to re-transmit signals of later as they fly away from Earth?
Is multiple magic items in one inherently imbalanced?
Relating to the President and obstruction, were Mueller's conclusions preordained?
What is the difference between a "ranged attack" and a "ranged weapon attack"?
Simple Http Server
In musical terms, what properties are varied by the human voice to produce different words / syllables?
A term for a woman complaining about things/begging in a cute/childish way
Is it possible for an event A to be independent from event B, but not the other way around?
Project Euler #1 in C++
Weaponising the Grasp-at-a-Distance spell
Getting out of while loop on console
New Order #6: Easter Egg
How to proper read this SML function that uses foldl?
Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern)
Data science time! April 2019 and salary with experience
The Ask Question Wizard is Live!How do you print inside a case statement in SML?SML Function Argument Pattern MatchingSML - Incrementing a value in a tuple during foldl that needs to be returnedImplementing Radix Sort in SMLSignature of higher order functions in SMLError: Operator is not a function - SMLHow to acess argument from a function passed as argument in SMLWhy am I getting “unbound variable or constructor” in my SML programUsing records as function arguments in SMLWhat is error of unresolved flex record in SML?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
I am new to SML and I am having trouble understanding what are arguments and what is being passed to the inner function in this code.
fun print_mat mat =
let
val _ = (Array.foldl (
fn (arr, _) =>
let val _ = (print_arr arr) in () end
) () mat)
in () end;
Which is meant to be used in:
val mat =
Array.fromList[
(Array.fromList [0, 1, 1, 0, 1]),
(Array.fromList [1, 0, 1, 0, 0])
]
val _ print_mat mat
What I am failing to see is how the arr
gets selected from my mat
and used inside the closure function.
sml smlnj mlton
add a comment |
I am new to SML and I am having trouble understanding what are arguments and what is being passed to the inner function in this code.
fun print_mat mat =
let
val _ = (Array.foldl (
fn (arr, _) =>
let val _ = (print_arr arr) in () end
) () mat)
in () end;
Which is meant to be used in:
val mat =
Array.fromList[
(Array.fromList [0, 1, 1, 0, 1]),
(Array.fromList [1, 0, 1, 0, 0])
]
val _ print_mat mat
What I am failing to see is how the arr
gets selected from my mat
and used inside the closure function.
sml smlnj mlton
Do you understand whatfoldl
does?
– melpomene
Mar 8 at 23:14
It applies the function (fn (arr, _) => ...
to every element of the Array data structure.
– nico
Mar 8 at 23:20
3
This code is overcomplicated. You should be able to shorten it tofun print_mat mat = Array.foldl (fn (arr, _) => print_arr arr) () mat
, which might make it easier to read. Or in fact justfun print_mat mat = Array.app print_arr mat
, because the fold is not needed here.
– Andreas Rossberg
Mar 9 at 10:09
add a comment |
I am new to SML and I am having trouble understanding what are arguments and what is being passed to the inner function in this code.
fun print_mat mat =
let
val _ = (Array.foldl (
fn (arr, _) =>
let val _ = (print_arr arr) in () end
) () mat)
in () end;
Which is meant to be used in:
val mat =
Array.fromList[
(Array.fromList [0, 1, 1, 0, 1]),
(Array.fromList [1, 0, 1, 0, 0])
]
val _ print_mat mat
What I am failing to see is how the arr
gets selected from my mat
and used inside the closure function.
sml smlnj mlton
I am new to SML and I am having trouble understanding what are arguments and what is being passed to the inner function in this code.
fun print_mat mat =
let
val _ = (Array.foldl (
fn (arr, _) =>
let val _ = (print_arr arr) in () end
) () mat)
in () end;
Which is meant to be used in:
val mat =
Array.fromList[
(Array.fromList [0, 1, 1, 0, 1]),
(Array.fromList [1, 0, 1, 0, 0])
]
val _ print_mat mat
What I am failing to see is how the arr
gets selected from my mat
and used inside the closure function.
sml smlnj mlton
sml smlnj mlton
asked Mar 8 at 23:11
niconico
322217
322217
Do you understand whatfoldl
does?
– melpomene
Mar 8 at 23:14
It applies the function (fn (arr, _) => ...
to every element of the Array data structure.
– nico
Mar 8 at 23:20
3
This code is overcomplicated. You should be able to shorten it tofun print_mat mat = Array.foldl (fn (arr, _) => print_arr arr) () mat
, which might make it easier to read. Or in fact justfun print_mat mat = Array.app print_arr mat
, because the fold is not needed here.
– Andreas Rossberg
Mar 9 at 10:09
add a comment |
Do you understand whatfoldl
does?
– melpomene
Mar 8 at 23:14
It applies the function (fn (arr, _) => ...
to every element of the Array data structure.
– nico
Mar 8 at 23:20
3
This code is overcomplicated. You should be able to shorten it tofun print_mat mat = Array.foldl (fn (arr, _) => print_arr arr) () mat
, which might make it easier to read. Or in fact justfun print_mat mat = Array.app print_arr mat
, because the fold is not needed here.
– Andreas Rossberg
Mar 9 at 10:09
Do you understand what
foldl
does?– melpomene
Mar 8 at 23:14
Do you understand what
foldl
does?– melpomene
Mar 8 at 23:14
It applies the function (
fn (arr, _) => ...
to every element of the Array data structure.– nico
Mar 8 at 23:20
It applies the function (
fn (arr, _) => ...
to every element of the Array data structure.– nico
Mar 8 at 23:20
3
3
This code is overcomplicated. You should be able to shorten it to
fun print_mat mat = Array.foldl (fn (arr, _) => print_arr arr) () mat
, which might make it easier to read. Or in fact just fun print_mat mat = Array.app print_arr mat
, because the fold is not needed here.– Andreas Rossberg
Mar 9 at 10:09
This code is overcomplicated. You should be able to shorten it to
fun print_mat mat = Array.foldl (fn (arr, _) => print_arr arr) () mat
, which might make it easier to read. Or in fact just fun print_mat mat = Array.app print_arr mat
, because the fold is not needed here.– Andreas Rossberg
Mar 9 at 10:09
add a comment |
1 Answer
1
active
oldest
votes
foldl
does something more than apply fn (arr, _) => ...
to every element. It accumulates a result, which in your case is discarded with the wildcard pattern, _
, in favor of the unit value, ()
. So, as Andreas Rossberg points out, you're not actually accumulating anything, or even generating any result value, so Array.app
is better suited.
To understand what
fun print_mat mat = Array.app print_arr mat
does, you can look at its implementation:
fun app f a =
let val a = from_array a
val stop = length_ a
fun lr j = if j < stop then (f(sub_ a j); lr (j+1))
else ()
in lr 0 end
Meaning, it calls f
(in your case print_arr
) on the 0th row of a
(in your case mat
), then on the 1st row, then on the 2nd until there are on more rows. When there are no more rows, return ()
. In the meantime, you have done nothing superfluous such as accumulate some value, since it will always be ()
that you return when done anyway.
I wonder if you have seen that Array2 exists. It should be pretty ideal for matrices.
As for understanding folding, see ML for the Working Programmer, ch. 5: Functions and infinite data.
I recommend that you understand folding in a list context first.
This is also what's best covered in learning material.
1
Thank you for this answer. I was not aware of the type of( )
. I also appreciate the links. Here myfn
does not return anything, thus it is best for me to useArray.app
as I am not doing any folds. With regards to(Array.foldl (fn) () mat)
From the implementation, now I understand that it requires 3 arguments. For future reference the second argument - that I passed( )
- has to match the return type offn
, and it is the value being aggregated after the fold functionfn
is applied to each element of theArray
data strucuture.
– nico
Mar 11 at 23:21
1
Yes, exactly. Good job!
– Simon Shine
Mar 12 at 8:04
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%2f55072274%2fhow-to-proper-read-this-sml-function-that-uses-foldl%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
foldl
does something more than apply fn (arr, _) => ...
to every element. It accumulates a result, which in your case is discarded with the wildcard pattern, _
, in favor of the unit value, ()
. So, as Andreas Rossberg points out, you're not actually accumulating anything, or even generating any result value, so Array.app
is better suited.
To understand what
fun print_mat mat = Array.app print_arr mat
does, you can look at its implementation:
fun app f a =
let val a = from_array a
val stop = length_ a
fun lr j = if j < stop then (f(sub_ a j); lr (j+1))
else ()
in lr 0 end
Meaning, it calls f
(in your case print_arr
) on the 0th row of a
(in your case mat
), then on the 1st row, then on the 2nd until there are on more rows. When there are no more rows, return ()
. In the meantime, you have done nothing superfluous such as accumulate some value, since it will always be ()
that you return when done anyway.
I wonder if you have seen that Array2 exists. It should be pretty ideal for matrices.
As for understanding folding, see ML for the Working Programmer, ch. 5: Functions and infinite data.
I recommend that you understand folding in a list context first.
This is also what's best covered in learning material.
1
Thank you for this answer. I was not aware of the type of( )
. I also appreciate the links. Here myfn
does not return anything, thus it is best for me to useArray.app
as I am not doing any folds. With regards to(Array.foldl (fn) () mat)
From the implementation, now I understand that it requires 3 arguments. For future reference the second argument - that I passed( )
- has to match the return type offn
, and it is the value being aggregated after the fold functionfn
is applied to each element of theArray
data strucuture.
– nico
Mar 11 at 23:21
1
Yes, exactly. Good job!
– Simon Shine
Mar 12 at 8:04
add a comment |
foldl
does something more than apply fn (arr, _) => ...
to every element. It accumulates a result, which in your case is discarded with the wildcard pattern, _
, in favor of the unit value, ()
. So, as Andreas Rossberg points out, you're not actually accumulating anything, or even generating any result value, so Array.app
is better suited.
To understand what
fun print_mat mat = Array.app print_arr mat
does, you can look at its implementation:
fun app f a =
let val a = from_array a
val stop = length_ a
fun lr j = if j < stop then (f(sub_ a j); lr (j+1))
else ()
in lr 0 end
Meaning, it calls f
(in your case print_arr
) on the 0th row of a
(in your case mat
), then on the 1st row, then on the 2nd until there are on more rows. When there are no more rows, return ()
. In the meantime, you have done nothing superfluous such as accumulate some value, since it will always be ()
that you return when done anyway.
I wonder if you have seen that Array2 exists. It should be pretty ideal for matrices.
As for understanding folding, see ML for the Working Programmer, ch. 5: Functions and infinite data.
I recommend that you understand folding in a list context first.
This is also what's best covered in learning material.
1
Thank you for this answer. I was not aware of the type of( )
. I also appreciate the links. Here myfn
does not return anything, thus it is best for me to useArray.app
as I am not doing any folds. With regards to(Array.foldl (fn) () mat)
From the implementation, now I understand that it requires 3 arguments. For future reference the second argument - that I passed( )
- has to match the return type offn
, and it is the value being aggregated after the fold functionfn
is applied to each element of theArray
data strucuture.
– nico
Mar 11 at 23:21
1
Yes, exactly. Good job!
– Simon Shine
Mar 12 at 8:04
add a comment |
foldl
does something more than apply fn (arr, _) => ...
to every element. It accumulates a result, which in your case is discarded with the wildcard pattern, _
, in favor of the unit value, ()
. So, as Andreas Rossberg points out, you're not actually accumulating anything, or even generating any result value, so Array.app
is better suited.
To understand what
fun print_mat mat = Array.app print_arr mat
does, you can look at its implementation:
fun app f a =
let val a = from_array a
val stop = length_ a
fun lr j = if j < stop then (f(sub_ a j); lr (j+1))
else ()
in lr 0 end
Meaning, it calls f
(in your case print_arr
) on the 0th row of a
(in your case mat
), then on the 1st row, then on the 2nd until there are on more rows. When there are no more rows, return ()
. In the meantime, you have done nothing superfluous such as accumulate some value, since it will always be ()
that you return when done anyway.
I wonder if you have seen that Array2 exists. It should be pretty ideal for matrices.
As for understanding folding, see ML for the Working Programmer, ch. 5: Functions and infinite data.
I recommend that you understand folding in a list context first.
This is also what's best covered in learning material.
foldl
does something more than apply fn (arr, _) => ...
to every element. It accumulates a result, which in your case is discarded with the wildcard pattern, _
, in favor of the unit value, ()
. So, as Andreas Rossberg points out, you're not actually accumulating anything, or even generating any result value, so Array.app
is better suited.
To understand what
fun print_mat mat = Array.app print_arr mat
does, you can look at its implementation:
fun app f a =
let val a = from_array a
val stop = length_ a
fun lr j = if j < stop then (f(sub_ a j); lr (j+1))
else ()
in lr 0 end
Meaning, it calls f
(in your case print_arr
) on the 0th row of a
(in your case mat
), then on the 1st row, then on the 2nd until there are on more rows. When there are no more rows, return ()
. In the meantime, you have done nothing superfluous such as accumulate some value, since it will always be ()
that you return when done anyway.
I wonder if you have seen that Array2 exists. It should be pretty ideal for matrices.
As for understanding folding, see ML for the Working Programmer, ch. 5: Functions and infinite data.
I recommend that you understand folding in a list context first.
This is also what's best covered in learning material.
answered Mar 11 at 12:38
Simon ShineSimon Shine
10.2k13050
10.2k13050
1
Thank you for this answer. I was not aware of the type of( )
. I also appreciate the links. Here myfn
does not return anything, thus it is best for me to useArray.app
as I am not doing any folds. With regards to(Array.foldl (fn) () mat)
From the implementation, now I understand that it requires 3 arguments. For future reference the second argument - that I passed( )
- has to match the return type offn
, and it is the value being aggregated after the fold functionfn
is applied to each element of theArray
data strucuture.
– nico
Mar 11 at 23:21
1
Yes, exactly. Good job!
– Simon Shine
Mar 12 at 8:04
add a comment |
1
Thank you for this answer. I was not aware of the type of( )
. I also appreciate the links. Here myfn
does not return anything, thus it is best for me to useArray.app
as I am not doing any folds. With regards to(Array.foldl (fn) () mat)
From the implementation, now I understand that it requires 3 arguments. For future reference the second argument - that I passed( )
- has to match the return type offn
, and it is the value being aggregated after the fold functionfn
is applied to each element of theArray
data strucuture.
– nico
Mar 11 at 23:21
1
Yes, exactly. Good job!
– Simon Shine
Mar 12 at 8:04
1
1
Thank you for this answer. I was not aware of the type of
( )
. I also appreciate the links. Here my fn
does not return anything, thus it is best for me to use Array.app
as I am not doing any folds. With regards to (Array.foldl (fn) () mat)
From the implementation, now I understand that it requires 3 arguments. For future reference the second argument - that I passed ( )
- has to match the return type of fn
, and it is the value being aggregated after the fold function fn
is applied to each element of the Array
data strucuture.– nico
Mar 11 at 23:21
Thank you for this answer. I was not aware of the type of
( )
. I also appreciate the links. Here my fn
does not return anything, thus it is best for me to use Array.app
as I am not doing any folds. With regards to (Array.foldl (fn) () mat)
From the implementation, now I understand that it requires 3 arguments. For future reference the second argument - that I passed ( )
- has to match the return type of fn
, and it is the value being aggregated after the fold function fn
is applied to each element of the Array
data strucuture.– nico
Mar 11 at 23:21
1
1
Yes, exactly. Good job!
– Simon Shine
Mar 12 at 8:04
Yes, exactly. Good job!
– Simon Shine
Mar 12 at 8:04
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%2f55072274%2fhow-to-proper-read-this-sml-function-that-uses-foldl%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
Do you understand what
foldl
does?– melpomene
Mar 8 at 23:14
It applies the function (
fn (arr, _) => ...
to every element of the Array data structure.– nico
Mar 8 at 23:20
3
This code is overcomplicated. You should be able to shorten it to
fun print_mat mat = Array.foldl (fn (arr, _) => print_arr arr) () mat
, which might make it easier to read. Or in fact justfun print_mat mat = Array.app print_arr mat
, because the fold is not needed here.– Andreas Rossberg
Mar 9 at 10:09