2012-05-17 22 views
6

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''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?

+0

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

+3

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. –

+4

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

Trả lời

11

phong cách này là rất phổ biến:

let nums = another 
     . bunch 
     . of_ 
     . functions 
     . a 
     . bunch 
     . of_ 
     . functions 
     $ [1..10] 

Nó phác họa rõ mã; trong khi . phục vụ vị trí của tên biến tạm thời.

Và tránh các vấn đề nguy hiểm có thể xảy ra khi bạn bắt đầu đổ bóng tên biến - vô tình đề cập đến sai x sẽ giúp bạn gặp rắc rối sớm hay muộn.

4

Nếu bạn hoàn toàn phải, có thể, nhưng không phải là thành ngữ. Sử dụng những gì Don hoặc luqui đề nghị thay thế.

main = do 
    nums <- return [1..10] 
    nums <- return $ a . bunch . of_ . functions $ nums 
    nums <- return $ another . bunch . of_ . functions $ nums 
    print nums 

Nếu bạn không ở một đơn vị, bạn luôn có thể bắt đầu một khối mới làm mẫu đơn sắc.

6

Kể từ khi tên của bạn (nums, nums', nums'' ...) truyền đạt không có thông tin về các nhóm, bạn chỉ có thể sử dụng dấu ngắt dòng để nhóm các chức năng và giao tiếp cùng một điều:

main = 
    let nums = a . bunch . of_ . functions 
      . another . bunch . of_ . functions 
      $ [1..10] 
    in print nums 

Tuy nhiên, Tôi sẽ đề nghị rằng thay vì làm điều này, bạn cung cấp cho các tên subcomputations mà làm truyền đạt thông tin, ví dụ như. normalizedNums, average, v.v. Sau đó, không có vấn đề về bóng tối xấu vì bạn đang sử dụng các tên riêng biệt.

7

Đây là đề xuất mà không ai khác cho tôi sử dụng theo thời gian: bạn có thể đặt tên cho các chức năng của mình thay vì đặt tên các giá trị của bạn!Ví dụ, có lẽ bạn có thể viết:

let runningSum = a . bunch . of_ . functions 
    weight  = another . bunch . of_ . functions 
in weight . runningSum $ [1..10] 
Các vấn đề liên quan