Tôi nghĩ rằng đó là chủ yếu cho sự nhất quán để tất cả các mệnh đề có thể được đọc theo cách tương tự, do đó, để nói chuyện; tức là mọi RHS đều có cùng vị trí trong loại chức năng. Tôi nghĩ rằng sẽ che giấu khá một vài lỗi ngớ ngẩn nếu bạn cho phép điều này, quá.
Ngoài ra còn có một quirk ngữ nghĩa nhẹ: nói rằng trình biên dịch đưa ra các mệnh đề như vậy để có cùng số mẫu như các mệnh đề khác; ví dụ: ví dụ của bạn sẽ trở thành
safeDivide x 0 = x
safeDivide x y = (/) x y
Bây giờ, hãy xem xét nếu dòng thứ hai thay vì là safeDivide = undefined
; trong trường hợp không có điều khoản trước đó, safeDivide
sẽ là ⊥
, nhưng nhờ vào việc mở rộng eta được thực hiện tại đây, nó là \x y -> if y == 0 then x else ⊥
- vì vậy safeDivide = undefined
không thực sự xác định safeDivide
là ⊥
! Điều này có vẻ khó hiểu, đủ để biện minh cho việc cấm các điều khoản như vậy, IMO.
Bạn gọi là "an toàn"? Hãy để nó trả về một 'Có thể' hoặc một cái gì đó, hoặc ném một số ngoại lệ đã biết hoặc sử dụng nó trên một' newtype' dành riêng cho các hàm không thoái hóa mà bạn coi là thành viên của ví dụ. không gian Hilbert L² (tức là chỉ được định nghĩa các bộ null); điều đó sẽ an toàn. Chỉ cần xác định 'x/0 = x' _ad hoc_ cho tất cả các trường hợp' Fractional' là vô cùng phi lý! - Vâng, nó có lẽ chỉ có nghĩa là một ví dụ. – leftaroundabout
+1 Wow, được sử dụng Haskell trong nhiều năm và không bao giờ nhận thấy rằng định nghĩa như vậy là không được phép! – is7s
@leftaroundabout 'safeDivide x 0 = Không có gì; safeDivide = Chỉ.: (/) 'tốt hơn? :) –