Tại sao Haskell lại tích hợp sẵn trong if / then / other khác thay vì định nghĩa nó là một hàm thư viện đơn giản?


25

Tại sao Haskell có tích hợp sẵn if/then/else, phụ thuộc vào Boolloạ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

4
Tôi đoán họ rõ ràng muốn cú pháp if / then / other mà họ không thể có được nếu không có các hàm mixfix như họ có trong agda. Hàm mà bạn đề cập được cấu trúc như một ternary, mà bạn có thể tự thực hiện mặc dù tôi cho rằng họ đã cho chúng tôi nếu / sau đó / đường khác (có thể chỉ là đường qua một trường hợp) chỉ vì chúng có thể và nó vô hại .. Nhưng tôi không có gì để hỗ trợ tôi ở đây, đó là lý do tại sao tôi viết bài này trong một bình luận.
Jimmy Hoffa

10
Điều này có thể rõ ràng đối với hầu hết các độc giả, nhưng tôi muốn chỉ ra rằng có îf / then / khác như một chức năng sẽ không phải là một giải pháp tốt trong một ngôn ngữ háo hức (ví dụ như lược đồ hoặc sml) trong khi nó hợp lý trong sự lười biếng ngôn ngữ như Haskell.
Giorgio

Câu trả lời:


24

Đó là hoàn toàn cho đường đẹp của if, thenelsetừ khóa; trong thực tế, GHC (với RebindableSyntaxtiệ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ỳ ifThenElsehàm nào trong phạm vi.


6

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.


3
Tôi không nghĩ rằng nội tuyến là một vấn đề thực tế. Tôi hiểu rằng GHC đặc biệt giỏi trong việc sắp xếp các hàm nhỏ, bởi vì nó chỉ là một mô hình phổ biến như vậy trong Haskell.
Tikhon Jelvis

1
@TikhonJelvis Chắc chắn, nhưng với if / then / other, bạn không cần một chức năng đặc biệt phải luôn luôn được nội tuyến. Bạn thậm chí không cần vượt qua nội tuyến và bạn vẫn có thể tạo mã tốt. Không phải tất cả thế giới là GHC.
Ingo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.