dotnet / dotnet/fsharp

Better diagnostics when using "as alias" in binding without wrapping expression in parens

Đang mở
#5,259 6 bình luận 0 reaction 0 người được giao Xem trên GitHub
Area-Diagnostics Feature Improvement
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

Mở 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

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.