Mod note: As of SDK 1.5.0 Scenarios have been superseded by the more powerful Daml Script. We now recommend using that for all purposes. For more information, and to learn how to use Script please check out @Andreas’ post on our blog.
Hello good morning. I would like to ask if there’s a way to print out unserializable result types? For my instance it’s an “unserializable scenario result”.
Thanks!
2 Likes
Hi @carleslabon!
Implementing or deriving Show
typeclass instance for your type will allow printing values of this type. Not sure if that is what you are asking?
I will be able to help more if you provide the error message and DAML code that causes this error.
See docs:
2 Likes
Hello @Leonid_Shlyapnikov, below are the following:
Error message: “Unserializable scenario result”.
DAML code:
import DA.Optional
template Sample
with
p : Party
where
signatory p
controller p can
nonconsuming SampleConsume : ()
with x : Int
cid : ContractId Sample
do
if x > 0
then archive cid
else pure ()
whenSome_test = scenario do
p <- getParty "p"
cid <- submit p (create Sample with p)
let
x = whenSome None (\x -> submit p $ exercise cid $ SampleConsume x cid)
return(x)
1 Like
Hi @carleslabon,
In your example, x
has type Scenario ()
which is not serializable. The definition of serializability is built into DAML so you cannot change that.
However, I expect this example is not what you want: You are only defining a scenario and calling it x
, you are not actually executing it. For that, you need to sequence it with <-
within the do block:
whenSome_test = scenario do
p <- getParty "p"
cid <- submit p (create Sample with p)
x <- whenSome None (\x -> submit p $ exercise cid $ SampleConsume x cid)
return(x)
Then x
has type ()
instead of Scenario ()
which is serializable and things work out fine.
4 Likes
@carleslabon!
What version of DAML SDK are you using in your project? I tried your example, it worked on SDK 1.4.0:
$ daml version
DAML SDK versions:
1.4.0 (project SDK version from daml.yaml)
Here is the output:
2 Likes
@Leonid_Shlyapnikov it’s not a fatal error, it’s just a message you see in the transaction view (but not the table view in your screenshot) at the end since the result type cannot be printed.
2 Likes
Got it.
What @cocreature said… Replace
let
x = whenSome None (\x -> submit p $ exercise
where x
has type Scenario ()
with
x <- whenSome None (\x -> submit p $ exercise cid $ SampleConsume x cid)
where x
has type ()
because of the “unwrapping” nature of flat map operator: <-
.
In other words, see the same two DAML expressions with types:
let
x : Scenario () = whenSome None (\x -> submit p $ exercise cid $ SampleConsume x cid)
see x: Scenario () = ...
and
x : () <- whenSome None (\x -> submit p $ exercise cid $ SampleConsume x cid)
I personally like adding types to more complex expressions, it might help with the code readability.
3 Likes
Hello @Leonid_Shlyapnikov, I tried it with the flat map operator “<-” and I finally got the result as expected. Thanks!
1 Like