2012-02-10 9 views
7

Tôi đã viết một cơ sở mã ngày càng tăng trong Haskell. Vấn đề của tôi là tôi đã thêm chữ ký kiểu vào các chức năng dựa trên những gì GHCI nói với tôi rằng họ nên làm như vậy.Làm cách nào để giữ cho Linh hoạt mạnh mẽ của Haskell?

Vấn đề bây giờ là tôi có một codebase đang phát triển, ngay sau khi tôi thay đổi một điều, mã của tôi sẽ bị phá vỡ khắp nơi và tôi bị tiêu hao với việc theo dõi tất cả các vấn đề.

Các loại có xuất phát bằng cách tải mô-đun trong ghci quá cụ thể không? Làm cách nào để quyết định loại hoặc loại lớp nào sẽ sử dụng trong chữ ký của tôi để tận dụng sức mạnh của việc nhập mạnh mẽ với tính linh hoạt nào đó? (ví dụ: không dành một giờ để tuyên truyền những thay đổi nhỏ?).

+4

Điều đó có vẻ hơi lạ. Chính xác những gì bạn đang làm mà phá vỡ tất cả các mã? Bạn có đang thay đổi các loại liên tục không? Thông thường, người ta sẽ tự sửa một thiết kế cho các kiểu của nó sau một thời gian (hoặc ngay cả khi bắt đầu), và hầu hết công việc sẽ nằm trên phần còn lại của mã (trong một Haskell được viết đúng cách sẽ độc lập đáng kinh ngạc). Cũng lưu ý rằng nếu bạn đang thêm các hàm tạo vào kiểu của bạn, sẽ không có gì đáng ngạc nhiên khi mã xử lý kiểu ngắt đó và trình biên dịch có ích trong việc chỉ ra các vấn đề tiềm ẩn, mặc dù generics có thể giúp nếu nó không phá vỡ mã. .. – Jedai

+5

Có lẽ bạn cần thực hiện một số từ đồng nghĩa hoặc loại định nghĩa để thay đổi của bạn có thể được bản địa hóa thành một điểm? – augustss

+2

Bạn có thể đưa ra một số ví dụ về những gì đang cố gắng đạt được và bạn mong đợi nó sẽ hoạt động như thế nào? – ondra

Trả lời

7

Vấn đề bây giờ là tôi có một codebase đang phát triển, ngay sau khi tôi thay đổi một điều, mã của tôi bị hỏng khắp nơi và tôi bị tiêu thụ với theo dõi tất cả các vấn đề.

Điều này thực sự được quảng cáo dưới dạng tính năng trong Yesod (một khung web Haskell). Giả sử tôi đã xác định các đặc điểm kỹ thuật định tuyến sau:

/blog/#String   BlogR GET 

Và tôi đã quyết định muốn thay đổi nó để

/blog/#Date/#String BlogR GET 

Ngay sau khi tôi thực hiện thay đổi này để các tuyến đường, trình biên dịch sẽ cho tôi biết ở khắp mọi nơi mà Tôi đã phá vỡ mã của tôi. Tôi sẽ bị buộc cập nhật chức năng getBlogR - thay đổi loại đầu vào của nó để nó cũng chấp nhận Date. Tôi cũng sẽ bị buộc phải cập nhật bất kỳ nơi nào tôi sử dụng URL an toàn loại trong các mẫu của mình, trông giống như là @{BlogR (slug p)} ->@{BlogR (date p) (slug p)}.

Đây được xem là một Tốt Thing, bởi vì kiểm tra loại là giúp bạn tìm lỗi nào do những thay đổi bạn đã thực hiện.


Hiện tại, liên quan đến ghci.

ghci> let shew = show 
ghci> :t shew 
shew ::() -> String 
ghci> :t show 
show :: Show a => a -> String 

Đôi khi đúng là ghci chọn mặc định gây phiền nhiễu. Điều này, tuy nhiên, có thể được giảm bớt.

ghci> :set -XNoMonomorphismRestriction 
ghci> let shew = show 
ghci> :t shew 
shew :: Show a => a -> String 

Trong khi sử dụng ghci để khám phá các loại của một hàm là rất tốt cho người mới bắt đầu, tôi sẽ không khuyên bạn nên dựa trên ghci. Tìm hiểu ý nghĩa của chữ ký loại và cách tự khám phá chúng. Trong thực tế, bắt đầu viết một hàm bằng cách đầu tiên viết chữ ký kiểu mà bạn dự định có. Nó chỉ mất một khoản đầu tư nhỏ thời gian để tìm hiểu kỹ năng này, và nó là một lợi ích lớn để lập trình khi bạn có thể sử dụng hệ thống kiểu của Haskell để lợi thế của bạn.

+1

Có nói tất cả điều này, câu trả lời thực sự cho câu hỏi của bạn có lẽ là những gì augustss đề nghị: loại từ đồng nghĩa và định nghĩa loại để làm sạch mã của bạn. –

+0

Tuyệt vời! Vấn đề của tôi là hệ thống kiểu phức tạp đến nỗi đối với người mới bắt đầu, tôi đoán đúng nhất là chữ ký, và cuối cùng chỉ hỏi ghci. (Các vấn đề hiện tại của tôi là với các kiểu chữ số). – Toymakerii

+0

Có cách nào để nói với GHCI hoặc một chương trình linting để so sánh các định nghĩa được mã hóa của tôi với những gì có thể là một phiên bản chung chung tốt hơn? – Toymakerii