mirror of
https://github.com/unisonweb/unison.git
synced 2024-09-11 10:35:57 +03:00
81 lines
1.3 KiB
Markdown
81 lines
1.3 KiB
Markdown
# Propagating type edits
|
|
|
|
```ucm:hide
|
|
scratch/main> builtins.merge lib.builtins
|
|
```
|
|
|
|
We introduce a type `Foo` with a function dependent `fooToInt`.
|
|
|
|
```unison
|
|
unique type Foo = Foo
|
|
|
|
fooToInt : Foo -> Int
|
|
fooToInt _ = +42
|
|
```
|
|
|
|
And then we add it.
|
|
|
|
```ucm
|
|
scratch/main> add
|
|
scratch/main> find.verbose
|
|
scratch/main> view fooToInt
|
|
```
|
|
|
|
Then if we change the type `Foo`...
|
|
|
|
```unison
|
|
unique type Foo = Foo | Bar
|
|
```
|
|
|
|
and update the codebase to use the new type `Foo`...
|
|
|
|
```ucm
|
|
scratch/main> update.old
|
|
```
|
|
|
|
... it should automatically propagate the type to `fooToInt`.
|
|
|
|
```ucm
|
|
scratch/main> view fooToInt
|
|
```
|
|
|
|
### Preserving user type variables
|
|
|
|
We make a term that has a dependency on another term and also a non-redundant
|
|
user-provided type signature.
|
|
|
|
```unison
|
|
preserve.someTerm : Optional foo -> Optional foo
|
|
preserve.someTerm x = x
|
|
|
|
preserve.otherTerm : Optional baz -> Optional baz
|
|
preserve.otherTerm y = someTerm y
|
|
```
|
|
|
|
Add that to the codebase:
|
|
|
|
```ucm
|
|
scratch/main> add
|
|
```
|
|
|
|
Let's now edit the dependency:
|
|
|
|
```unison
|
|
preserve.someTerm : Optional x -> Optional x
|
|
preserve.someTerm _ = None
|
|
```
|
|
|
|
Update...
|
|
|
|
```ucm
|
|
scratch/main> update.old
|
|
```
|
|
|
|
Now the type of `someTerm` should be `Optional x -> Optional x` and the
|
|
type of `otherTerm` should remain the same.
|
|
|
|
```ucm
|
|
scratch/main> view preserve.someTerm
|
|
scratch/main> view preserve.otherTerm
|
|
```
|