tôi tạo ra rất nhiều biến tạm thời trong Haskell:Tránh các biến tạm thời bằng cách sử dụng tên shadowing
main = do
let nums'' = [1..10]
let nums' = a . bunch . of_ . functions $ nums''
let nums = another . bunch . of_ . functions $ nums'
print nums
Đó là, tôi không muốn viết một chuỗi dài của các chức năng như vậy:
let nums = another . bunch . of_ . functions . a . bunch . of_ . functions $ [1..10]
Bởi vì nó trở nên không thể đọc được đối với tôi, vì vậy tôi cố gắng nhóm các chức năng theo những gì họ làm. Trong quá trình này, tôi kết thúc việc tạo ra một loạt các biến tạm thời xấu xí như nums''
và nums'
(tôi có thể cung cấp cho họ tên có ý nghĩa hơn, nhưng điểm vẫn đứng ... mỗi dòng mới có nghĩa là một biến mới). Đây là trường hợp biến được ẩn sẽ dẫn đến mã sạch hơn. Tôi muốn làm điều gì đó như:
let nums = [1..10]
nums = a . bunch . of_ . functions $ nums
nums = another . bunch . of_ . functions $ nums
I.e. chính xác giống như trên nhưng không có biến tạm thời. Có cách nào để làm điều này trong Haskell? Có lẽ toàn bộ điều có thể được bọc trong một "giao dịch":
atomically $ do
(...this code...)
return nums
Cái gì đó sẽ cho phép Haskell biết rằng mã trong phần này chứa các biến đổ bóng, và nó chỉ nên lo lắng về kết quả cuối cùng. Điều này có thể không?
Bạn cũng có thể sử dụng đơn nguyên nhà nước nếu bạn muốn vượt qua một giá trị cùng mà không có đột biến nhưng mà không tạo ra một loạt các tên – amindfv
tôi có thể tranh luận rằng (a) nếu bạn có ý nghĩa tên để cung cấp cho các bước trung gian, không có vấn đề gì; và (b) nếu bạn không có tên có ý nghĩa để đưa ra các bước trung gian, thì sẽ không có lợi ích gì khi phá vỡ chúng. Và từ (a) và (b) chúng ta có thể kết luận rằng không có vấn đề gì. Nó phụ thuộc vào việc bạn chấp nhận các cơ sở, tất nhiên. –
Tôi không đồng ý rằng việc sử dụng lại cùng một tên cho các mục đích khác nhau nhất thiết phải làm cho nó dễ đọc hơn. Bây giờ người đọc phải tìm ra biến nào ràng buộc mỗi lần xuất hiện đề cập đến. – augustss