Better diagnostics when using "as alias" in binding without wrapping expression in parens
- Ngôn ngữ chính
- F#
- Star
- 4.3k
- Fork
- 876
- Merge trung bình
- 5 ngày 9 giờ
- Pull request đã merge (30 ngày)
- 153
Mô tả
When giving alias via `as`, the first element of a tuple can be matched without wrapping it between parens, while the same doesn't work for any other items in the tuple.
```fsharp
let foo a b =
match a, b with
| Some _ as aa, None -> aa, None
| None, Some _ as bb -> None, bb // doesn't compile
```
> This expression was expected to have type ''a option' but here has type ''b option * 'c option'
if I wrap the second tuple element in the match in parens, it compiles:
```fsharp
let foo a b =
match a, b with
| Some _ as aa, None -> aa, None
| None, (Some _ as bb) -> None, bb
```
This seems to be inconsistent behaviour, failing principle of least surprise, and leading to confusing error message.
Is it according to spec or some issue that needs to be fixed? Should the parens be mandatory or optional in that case?
Reproduces in VS2015 and VS2017.
Hướng dẫn đóng góp
Hướng nghiên cứu
Bắt đầu bằng cách tái hiện hai biểu thức match F# được nêu trong issue và so sánh hành vi cùng chẩn đoán của compiler. Sau đó, kiểm tra các đường dẫn phân tích pattern và kiểm tra kiểu của compiler để xác định liệu cú pháp có tuân theo đặc tả hay không. Công việc được xem là hoàn tất khi đạt được quyết định được ghi lại về hành vi dấu ngoặc cần thiết và tạo ra chẩn đoán hoặc hành vi nhất quán, ít gây nhầm lẫn hơn.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- fsharp
- Lĩnh vực
- compilers
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 35/100