Các định nghĩa thường trong mệnh đề where
là để tránh lặp lại chính mình nếu một biểu thức con xuất hiện nhiều hơn một lần trong định nghĩa. Trong trường hợp này, lập trình viên nghĩ về định nghĩa cục bộ như là một stand-in đơn giản để viết ra các biểu thức con inline. Bạn thường sẽ không rõ ràng gõ các biểu thức con bên trong, vì vậy bạn không nhập định nghĩa where
. Nếu bạn đang thực hiện nó để tiết kiệm khi gõ, thì việc khai báo kiểu sẽ giết tất cả các khoản tiết kiệm của bạn.
Có vẻ như khá phổ biến khi giới thiệu where
cho người học Haskell với các ví dụ về biểu mẫu đó, vì vậy họ cứ nghĩ rằng "kiểu thông thường" không cung cấp các khai báo kiểu cho định nghĩa cục bộ. Ít nhất, đó là kinh nghiệm của tôi khi học Haskell. Tôi đã phát hiện ra rằng nhiều chức năng của tôi đủ phức tạp để cần một khối where
trở nên khá khó hiểu nếu tôi không biết loại định nghĩa cục bộ, vì vậy tôi cố gắng hướng tới việc luôn gõ chúng ngay bây giờ; ngay cả khi tôi nghĩ loại hình hiển nhiên trong khi tôi đang viết mã, nó có thể không rõ ràng khi tôi đọc nó sau khi không xem xét nó một lúc. Một chút nỗ lực cho các ngón tay của tôi hầu như luôn luôn nặng hơn bởi một hoặc hai trường hợp phải chạy suy luận kiểu trong đầu tôi!
Câu trả lời của Ingo đưa ra lý do chính đáng cho cố ý không đưa ra loại cho định nghĩa địa phương, nhưng tôi nghi ngờ nguyên nhân chính là nhiều lập trình viên đã đồng hóa quy tắc chung. cho các định nghĩa địa phương từ cách họ học Haskell.
Tôi không thể trả lời câu hỏi có hay không sẽ biên soạn nhanh hơn, nhưng thực hành tốt nhất là viết ra chữ ký loại nếu đó là một hàm không tầm thường. – Wes
Ngoài ra, nhiều định nghĩa cục bộ này cần phải truy cập các biến kiểu từ phạm vi bên ngoài, có xu hướng làm lộn xộn mã với 'asTypeOf' và bạn bè, trừ khi bạn sử dụng' ScopedTypeVariables'. – Vitus
Nếu chức năng của bạn là đủ quan trọng để có được một tuyên bố loại, tại sao không làm cho nó một công dân hạng nhất? – rotskoff