Combining multiple `Try` instances of different result types as applicatives
Is there an api for combining Try
instances in Vavr that is similar to the way the Scalaz applicative operator |@|
works?
Specifically, if I have more than two Try
instances, for example, Try<X>
, Try<Y>
and Try<Z>
, I would like to combine these instances in an applicative fashion using a 3-arg function.
I'm looking for a function signature that is similar to:
static <X, Y, Z, R> Try<R> combine(Try<X> x, Try<Y> y, Try<Z> z, Function3<X,Y,Z,R> func
java-8 functional-programming vavr
add a comment |
Is there an api for combining Try
instances in Vavr that is similar to the way the Scalaz applicative operator |@|
works?
Specifically, if I have more than two Try
instances, for example, Try<X>
, Try<Y>
and Try<Z>
, I would like to combine these instances in an applicative fashion using a 3-arg function.
I'm looking for a function signature that is similar to:
static <X, Y, Z, R> Try<R> combine(Try<X> x, Try<Y> y, Try<Z> z, Function3<X,Y,Z,R> func
java-8 functional-programming vavr
add a comment |
Is there an api for combining Try
instances in Vavr that is similar to the way the Scalaz applicative operator |@|
works?
Specifically, if I have more than two Try
instances, for example, Try<X>
, Try<Y>
and Try<Z>
, I would like to combine these instances in an applicative fashion using a 3-arg function.
I'm looking for a function signature that is similar to:
static <X, Y, Z, R> Try<R> combine(Try<X> x, Try<Y> y, Try<Z> z, Function3<X,Y,Z,R> func
java-8 functional-programming vavr
Is there an api for combining Try
instances in Vavr that is similar to the way the Scalaz applicative operator |@|
works?
Specifically, if I have more than two Try
instances, for example, Try<X>
, Try<Y>
and Try<Z>
, I would like to combine these instances in an applicative fashion using a 3-arg function.
I'm looking for a function signature that is similar to:
static <X, Y, Z, R> Try<R> combine(Try<X> x, Try<Y> y, Try<Z> z, Function3<X,Y,Z,R> func
java-8 functional-programming vavr
java-8 functional-programming vavr
edited Nov 13 '18 at 4:34
divesh premdeep
asked Nov 13 '18 at 4:10
divesh premdeepdivesh premdeep
57521020
57521020
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
As far as I can see it doesn't support that usage directly. You can, however, achieve it using flatMap:
static <X, Y, Z, R> Try<R> combine(Try<X> tx, Try<Y> ty, Try<Z> tz, Function3<X,Y,Z,R> func) {
return tx.flatMap(x -> ty.flatMap(y -> tz.map(z -> func.apply(x, y, z))));
}
If each Try value contains the same type then you can use a sequence
operation:
public static void main(String args) {
List<Try<String>> lt = List.of(Try.success("A"), Try.success("B"), Try.success("C"));
Try<List<String>> tl = sequence(lt);
System.out.println(tl);
}
static <T> Try<List<T>> sequence(List<Try<T>> lt) {
return lt.foldRight(
Try.success(List.empty()),
(tt, tl) -> tt.flatMap(t -> tl.flatMap(l -> Try.success(l.prepend(t))))
);
}
If you compare the input and output types you can see this essentially swaps the position of the Try
and List
containers. It's fairly idiomatic for monads, though typically you would implement it with applicative map operations instead of flatMap.
Alternatively, use Validation, which is designed to be used in an applicative style (via Validation.combine
).
Yeah, although for more than 3Try
instances, those nestedflatMap
calls can get a bit hairy! I could useValidation
, but it doesn't seem to be a good fit for my use case (except for the applicative syntax it supports). Thanks.
– divesh premdeep
Nov 15 '18 at 0:09
Or maybe I could write a convenience method that does exactly what you've suggested :thinking-face:
– divesh premdeep
Nov 15 '18 at 0:50
@diveshpremdeep I've edited the answer to offer another alternative -sequence
.
– jon-hanson
Nov 15 '18 at 7: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%2f53273678%2fcombining-multiple-try-instances-of-different-result-types-as-applicatives%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
As far as I can see it doesn't support that usage directly. You can, however, achieve it using flatMap:
static <X, Y, Z, R> Try<R> combine(Try<X> tx, Try<Y> ty, Try<Z> tz, Function3<X,Y,Z,R> func) {
return tx.flatMap(x -> ty.flatMap(y -> tz.map(z -> func.apply(x, y, z))));
}
If each Try value contains the same type then you can use a sequence
operation:
public static void main(String args) {
List<Try<String>> lt = List.of(Try.success("A"), Try.success("B"), Try.success("C"));
Try<List<String>> tl = sequence(lt);
System.out.println(tl);
}
static <T> Try<List<T>> sequence(List<Try<T>> lt) {
return lt.foldRight(
Try.success(List.empty()),
(tt, tl) -> tt.flatMap(t -> tl.flatMap(l -> Try.success(l.prepend(t))))
);
}
If you compare the input and output types you can see this essentially swaps the position of the Try
and List
containers. It's fairly idiomatic for monads, though typically you would implement it with applicative map operations instead of flatMap.
Alternatively, use Validation, which is designed to be used in an applicative style (via Validation.combine
).
Yeah, although for more than 3Try
instances, those nestedflatMap
calls can get a bit hairy! I could useValidation
, but it doesn't seem to be a good fit for my use case (except for the applicative syntax it supports). Thanks.
– divesh premdeep
Nov 15 '18 at 0:09
Or maybe I could write a convenience method that does exactly what you've suggested :thinking-face:
– divesh premdeep
Nov 15 '18 at 0:50
@diveshpremdeep I've edited the answer to offer another alternative -sequence
.
– jon-hanson
Nov 15 '18 at 7:50
add a comment |
As far as I can see it doesn't support that usage directly. You can, however, achieve it using flatMap:
static <X, Y, Z, R> Try<R> combine(Try<X> tx, Try<Y> ty, Try<Z> tz, Function3<X,Y,Z,R> func) {
return tx.flatMap(x -> ty.flatMap(y -> tz.map(z -> func.apply(x, y, z))));
}
If each Try value contains the same type then you can use a sequence
operation:
public static void main(String args) {
List<Try<String>> lt = List.of(Try.success("A"), Try.success("B"), Try.success("C"));
Try<List<String>> tl = sequence(lt);
System.out.println(tl);
}
static <T> Try<List<T>> sequence(List<Try<T>> lt) {
return lt.foldRight(
Try.success(List.empty()),
(tt, tl) -> tt.flatMap(t -> tl.flatMap(l -> Try.success(l.prepend(t))))
);
}
If you compare the input and output types you can see this essentially swaps the position of the Try
and List
containers. It's fairly idiomatic for monads, though typically you would implement it with applicative map operations instead of flatMap.
Alternatively, use Validation, which is designed to be used in an applicative style (via Validation.combine
).
Yeah, although for more than 3Try
instances, those nestedflatMap
calls can get a bit hairy! I could useValidation
, but it doesn't seem to be a good fit for my use case (except for the applicative syntax it supports). Thanks.
– divesh premdeep
Nov 15 '18 at 0:09
Or maybe I could write a convenience method that does exactly what you've suggested :thinking-face:
– divesh premdeep
Nov 15 '18 at 0:50
@diveshpremdeep I've edited the answer to offer another alternative -sequence
.
– jon-hanson
Nov 15 '18 at 7:50
add a comment |
As far as I can see it doesn't support that usage directly. You can, however, achieve it using flatMap:
static <X, Y, Z, R> Try<R> combine(Try<X> tx, Try<Y> ty, Try<Z> tz, Function3<X,Y,Z,R> func) {
return tx.flatMap(x -> ty.flatMap(y -> tz.map(z -> func.apply(x, y, z))));
}
If each Try value contains the same type then you can use a sequence
operation:
public static void main(String args) {
List<Try<String>> lt = List.of(Try.success("A"), Try.success("B"), Try.success("C"));
Try<List<String>> tl = sequence(lt);
System.out.println(tl);
}
static <T> Try<List<T>> sequence(List<Try<T>> lt) {
return lt.foldRight(
Try.success(List.empty()),
(tt, tl) -> tt.flatMap(t -> tl.flatMap(l -> Try.success(l.prepend(t))))
);
}
If you compare the input and output types you can see this essentially swaps the position of the Try
and List
containers. It's fairly idiomatic for monads, though typically you would implement it with applicative map operations instead of flatMap.
Alternatively, use Validation, which is designed to be used in an applicative style (via Validation.combine
).
As far as I can see it doesn't support that usage directly. You can, however, achieve it using flatMap:
static <X, Y, Z, R> Try<R> combine(Try<X> tx, Try<Y> ty, Try<Z> tz, Function3<X,Y,Z,R> func) {
return tx.flatMap(x -> ty.flatMap(y -> tz.map(z -> func.apply(x, y, z))));
}
If each Try value contains the same type then you can use a sequence
operation:
public static void main(String args) {
List<Try<String>> lt = List.of(Try.success("A"), Try.success("B"), Try.success("C"));
Try<List<String>> tl = sequence(lt);
System.out.println(tl);
}
static <T> Try<List<T>> sequence(List<Try<T>> lt) {
return lt.foldRight(
Try.success(List.empty()),
(tt, tl) -> tt.flatMap(t -> tl.flatMap(l -> Try.success(l.prepend(t))))
);
}
If you compare the input and output types you can see this essentially swaps the position of the Try
and List
containers. It's fairly idiomatic for monads, though typically you would implement it with applicative map operations instead of flatMap.
Alternatively, use Validation, which is designed to be used in an applicative style (via Validation.combine
).
edited Nov 15 '18 at 11:42
answered Nov 14 '18 at 22:28
jon-hansonjon-hanson
6,15622651
6,15622651
Yeah, although for more than 3Try
instances, those nestedflatMap
calls can get a bit hairy! I could useValidation
, but it doesn't seem to be a good fit for my use case (except for the applicative syntax it supports). Thanks.
– divesh premdeep
Nov 15 '18 at 0:09
Or maybe I could write a convenience method that does exactly what you've suggested :thinking-face:
– divesh premdeep
Nov 15 '18 at 0:50
@diveshpremdeep I've edited the answer to offer another alternative -sequence
.
– jon-hanson
Nov 15 '18 at 7:50
add a comment |
Yeah, although for more than 3Try
instances, those nestedflatMap
calls can get a bit hairy! I could useValidation
, but it doesn't seem to be a good fit for my use case (except for the applicative syntax it supports). Thanks.
– divesh premdeep
Nov 15 '18 at 0:09
Or maybe I could write a convenience method that does exactly what you've suggested :thinking-face:
– divesh premdeep
Nov 15 '18 at 0:50
@diveshpremdeep I've edited the answer to offer another alternative -sequence
.
– jon-hanson
Nov 15 '18 at 7:50
Yeah, although for more than 3
Try
instances, those nested flatMap
calls can get a bit hairy! I could use Validation
, but it doesn't seem to be a good fit for my use case (except for the applicative syntax it supports). Thanks.– divesh premdeep
Nov 15 '18 at 0:09
Yeah, although for more than 3
Try
instances, those nested flatMap
calls can get a bit hairy! I could use Validation
, but it doesn't seem to be a good fit for my use case (except for the applicative syntax it supports). Thanks.– divesh premdeep
Nov 15 '18 at 0:09
Or maybe I could write a convenience method that does exactly what you've suggested :thinking-face:
– divesh premdeep
Nov 15 '18 at 0:50
Or maybe I could write a convenience method that does exactly what you've suggested :thinking-face:
– divesh premdeep
Nov 15 '18 at 0:50
@diveshpremdeep I've edited the answer to offer another alternative -
sequence
.– jon-hanson
Nov 15 '18 at 7:50
@diveshpremdeep I've edited the answer to offer another alternative -
sequence
.– jon-hanson
Nov 15 '18 at 7: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%2f53273678%2fcombining-multiple-try-instances-of-different-result-types-as-applicatives%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