Tại sao Haskell có tích hợp sẵn if/then/else
, phụ thuộc vào Bool
loại, thay vì có chức năng thư viện đơn giản? Nhu la
if :: Bool -> a -> a -> a
if True x _ = x
if False _ y = y
Tại sao Haskell có tích hợp sẵn if/then/else
, phụ thuộc vào Bool
loại, thay vì có chức năng thư viện đơn giản? Nhu la
if :: Bool -> a -> a -> a
if True x _ = x
if False _ y = y
Câu trả lời:
Đó là hoàn toàn cho đường đẹp của if
, then
và else
từ khóa; trong thực tế, GHC (với RebindableSyntax
tiện ích mở rộng được kích hoạt) sẽ bỏ qua cú pháp bằng cách gọi bất kỳ ifThenElse
hàm nào trong phạm vi.
Nó không quan trọng lắm ... đối với tôi có vẻ như nếu / thì / ngày nay không được sử dụng thường xuyên. Tôi thấy mình viết mẫu bảo vệ instad của nếu .. thì .. khác.
Tuy nhiên, theo quan điểm cú pháp, thật tuyệt khi có
if expr1 then expr2 else expr3
Vì vậy bạn có thể viết
if foo a then bar b else baz c
thay vì
if (foo a) (bar b) (baz c)
có vẻ hơi quá LISPish với tôi.
Đối với phân tích ngữ nghĩa và tạo mã, thật tuyệt khi có cấu trúc này, có thể dễ dàng được biên dịch thành mã máy hiệu quả. Lưu ý rằng mã có thể bỏ qua phần làm cho thunk cho nhánh không đạt được, trái ngược với lệnh gọi hàm, trong đó tất cả các tham số (không đánh giá) phải được thông qua. Nhưng nó cũng tốn thời gian (và bộ nhớ, phải được thu hồi sau) để tạo ra thunk. Để làm tốt điều này, người ta sẽ phải nội tuyến hàm if ở mọi nơi.