1    private@
2    
3    do
4        let f (s : String) =
5            let! x = i32.try_parse s
6            x as u32 + 2 |> Some
7    
8        let r1 = f "5"
9        assert r1 == Some 7
10   
11       let r2 = f "5k"
12       assert r2.is_none
13   
14   let parse_number (s : String) =
15       let maybe_number = i32.try_parse s
16       case maybe_number of
17           None -> Result/Error "cannot parse number from $s"
18           Some number -> Result/Ok number
19   
20   do
21       let f (s : String) =
22           let! x = parse_number s
23           x + 2 |> Some
24   
25       let r1 = f "5"
26       assert r1 == Some 7
27   
28       let r2 = f "5k"
29       assert r2.is_none
30   
31   do
32       let f (s : String) =
33           let! x = parse_number s
34           x + 2 |> to_string |> Result/Ok
35   
36       let r1 = f "5"
37       assert r1 == Result/Ok "7"
38   
39       let r2 = f "5k"
40       assert r2.is_error
41   
42   do
43       let f (s : String) =
44           let! x = i32.try_parse s |> to_result "cannot parse"
45           x + 2 |> Result/Ok
46   
47       let r1 = f "5"
48       assert r1 == Result/Ok 7
49   
50       let r2 = f "5k"
51       assert r2 == Result/Error "cannot parse"
52   
53   type ParseError = String
54   type Error =
55       | t@ ParseError
56   
57   do
58       let f (s : String) : Result<i32, Error> =
59           let! x = let error = ParseError s
60                    i32.try_parse s |> to_result error
61           x + 2 |> Result/Ok
62   
63       let r1 = f "5"
64       assert r1 == Result/Ok 7
65   
66       let r2 = f "5k"
67       let error2 = ParseError "5k" as Error
68       assert r2 == Result/Error error2
69