unison/unison-src/transcripts/fix693.output.md
Greg Pfeil 0031542faf
Add a space before code block info strings
This is for consistency with the `cmark` style. Now the blocks we still
pretty-print ourselves will match the bulk of them that `cmark`
produces.
2024-07-10 13:56:07 -06:00

2.6 KiB

structural ability X t where
  x : t -> a -> a

structural ability Abort where
  abort : a

  Loading changes detected in scratch.u.

  I found and typechecked these definitions in scratch.u. If you
  do an `add` or `update`, here's how your codebase would
  change:
  
    ⍟ These new definitions are ok to `add`:
    
      structural ability Abort
      structural ability X t

scratch/main> add

  ⍟ I've added these definitions:
  
    structural ability Abort
    structural ability X t

This code should not type check. The match on X.x ought to introduce a skolem variable a such that c : a and the continuation has type a ->{X} b. Thus, handle c with h : Optional a, which is not the correct result type.

h0 : Request {X t} b -> Optional b
h0 req = match req with
  { X.x _ c -> _ } -> handle c with h0
  { d } -> Some d

  Loading changes detected in scratch.u.

  Each case of a match / with expression need to have the same
  type.
  
  Here, one   is:  Optional b
  and another is:  Optional a
  
  
      3 |   { X.x _ c -> _ } -> handle c with h0
  
    from these spots, respectively:
  
      1 | h0 : Request {X t} b -> Optional b
  

This code should not check because t does not match b.

h1 : Request {X t} b -> Optional b
h1 req = match req with
  { X.x t _ -> _ } -> handle t with h1
  { d } -> Some d

  Loading changes detected in scratch.u.

  Each case of a match / with expression need to have the same
  type.
  
  Here, one   is:  Optional b
  and another is:  Optional t
  
  
      3 |   { X.x t _ -> _ } -> handle t with h1
  
    from these spots, respectively:
  
      1 | h1 : Request {X t} b -> Optional b
  

This code should not check for reasons similar to the first example, but with the continuation rather than a parameter.

h2 : Request {Abort} r -> r
h2 req = match req with
  { Abort.abort -> k } -> handle k 5 with h2
  { r } -> r

  Loading changes detected in scratch.u.

  The 1st argument to `k`
  
            has type:  Nat
      but I expected:  a
  
      3 |   { Abort.abort -> k } -> handle k 5 with h2
  

This should work fine.

h3 : Request {X b, Abort} b -> Optional b
h3 = cases
  { r } -> Some r
  { Abort.abort -> _ } -> None
  { X.x b _ -> _ } -> Some b

  Loading changes detected in scratch.u.

  I found and typechecked these definitions in scratch.u. If you
  do an `add` or `update`, here's how your codebase would
  change:
  
    ⍟ These new definitions are ok to `add`:
    
      h3 : Request {X b, Abort} b -> Optional b