Comments (6)
Forgot to tag any of the commits with a "fix" message.
from gradualizer.
A problem is that inferring the type using type_check_expr
is likely to return any()
for non-trivial arguments, which will make the whole thing vacuously true.
from gradualizer.
More type inference can be done using type_check_expr(Env#env{infer = true}, Expr)
. Do you see any problem in doing inference in this case with respect to the graduality property AKA gradual guarrantee from the papers?
from gradualizer.
Thanks for the thorough analysis. I suspect that there are a few similar problems lurking in the code.
The solution might be to compute the greatest lower bound of the result type and number()
(in the case of addition). Something like this:
L = glb(number, R)
check(A, L)
check(B, L)
------------------
check(A + B, R)
Note that the glb-operator would be a partial operation and if it doesn't find a lower bound it would result in a type error.
Your thoughts on this solution, @UlfNorell?
EDIT: The glb-operator would technically not be partial, as it can always return none()
; the bottom of the subtyping hierarchy. But if glb returns none()
we should report a type error because it better matches programmer expectation.
from gradualizer.
I think this makes sense, although you can construct examples where one could argue that the "right" thing to do is not failing on none()
:
-spec much_type_very_code(none()) -> none().
much_type_very_code(X) -> X + X.
from gradualizer.
Yes, there would have to be a special case for when the result is expected to be none()
.
from gradualizer.
Related Issues (20)
- Refine bound vars with guards
- Uncaught case clause error #{'Value' => {type,0,tuple,any}} HOT 1
- Keep track of variable bindings & types HOT 5
- Crash with Uncaught error: function_clause HOT 6
- Crash with `Uncaught error: {case_clause, ..` in `typechecker:do_type_check_expr/2`
- Crash with Uncaught error: {badkey, ...} HOT 1
- No clause for gradualizer_lib:pick_value(module()) HOT 2
- No clause of gradualizer_lib:pick_value(any()) HOT 2
- Support the new dynamic() type
- `ok bsr ok` crashes erl_eval:do_apply/7 HOT 4
- An invalid utf32 value can crash eval_bits:eval_exp_field/6
- Crash in gradualizer_fmt:format_type_error: no function_clause_matching
- Crash in typechecker:do_type_check_expr_in/3: bad_key in map_get/2
- Invalid polymorphic code accepted HOT 2
- Support old-style 'catch' keyword HOT 5
- Wrong type in receive...after Timeout
- `binary_to_atom/1` breaks compatibility below OTP 23 HOT 4
- Solving local constraints at each function call to a polymorphic function HOT 6
- support for OTP 26 map comprehensions
- Wrong type location reported?
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from gradualizer.