Tại sao những điều này không tương đương?
show $ if someCondition then someInt else some double
và
if someCondition then show someInt else show someDouble
Tôi hiểu rằng nếu bạn tách riêng if ... else
phần trong ví dụ đầu tiên thành một biểu thức thì bạn không thể biểu diễn kiểu của nó bằng loại tổng ẩn danh, loại Int | Double
, giống như một thứ bạn có thể làm dễ dàng trong TypeScript (đề cập đến TypeScript vì đó là langauge tôi đã sử dụng thường xuyên và hỗ trợ các loại Sum) và sẽ phải sử dụng Either
dữ liệu sau đó dựa trên dữ liệu đó show
.
Ví dụ tôi đưa ra ở đây là tầm thường nhưng với tôi nó có ý nghĩa hơn khi nghĩ rằng "Được rồi, chúng tôi sẽ trình bày một cái gì đó, và cái gì đó phụ thuộc vào someCondition
" chứ không phải là "Được rồi nếu một số điều kiện là đúng thì hiển thị một số cách khác" và cũng cho phép để sao chép mã ít hơn (ở đây chương trình được lặp lại hai lần nhưng nó cũng có thể là một ứng dụng chức năng dài và thay vì if ... else
có thể có> 2 nhánh để xem xét)
Trong suy nghĩ của tôi, trình biên dịch sẽ dễ dàng kiểm tra xem mỗi loại tạo ra loại tổng (ở đây Int | Double
) có thể được sử dụng làm tham số cho show
hàm hay không và quyết định xem các loại có đúng hay không. Thậm chí tốt hơn là show
hàm luôn trả về string
bất kể các loại tham số, vì vậy trình biên dịch không phải mang theo tất cả các "nhánh" có thể (vì vậy tất cả các loại có thể).
Có phải do sự lựa chọn mà một tính năng như vậy không tồn tại? Hay là thực hiện nó khó hơn tôi nghĩ?
making all conversions explicit
. Trong câu hỏi của tôi, tôi không muốn Haskell bỏ Int
qua một Double
hoặc ngược lại. Tôi chỉ sử dụng hai loại đó làm ví dụ. Bạn có thể thay thế tất cả Int
với a
và Double
với b
trong câu hỏi của tôi, nơi cả hai loại lấy được Show
. Tôi hiểu rằng không có anonymous sum types
trong Haskell nhưng tôi muốn biết tại sao lại như vậy và điều gì ngăn cản chúng tôi thiết kế ngôn ngữ để có nó.
x :: Int | Bool
và chúng ta phải biên dịch show x
, không có cách nào dễ dàng để biết sử dụng chức năng con trỏ nào để gọi show
, trong RTS dựa trên kiểu xóa. Có lẽ chúng ta cần giữ một số thông tin cấp độ trong thời gian chạy.
(String, Int)
không ẩn danh Nó chỉ là một loại sản phẩm thông thường với cú pháp vui nhộn. (String | Int)
sẽ là rất nhiều khác nhau. Bắt đầu với việc tự hỏi liệu có (Int|Int)
nên giống hệt Int
và tại sao.
if ... then ... else ...
, cần phải có cùng loại trongthen
vàelse
một phần. Bạn có thể thấy nó như là một toán tử ternary trong một số ngôn ngữ lập trình.