Vâng, gõ yếu so với mạnh mẽ được định nghĩa khá mơ hồ. Hơn nữa, vì gần nhất có một cách sử dụng chung là 'gõ mạnh' là để chỉ những thứ gây khó khăn cho việc tạo kiểu, nên không còn gì để mô tả các hệ thống loại mạnh hơn nữa. Nó giống như nói rằng nếu bạn có thể mang dưới 30 lbs thì bạn yếu và tất cả những người có thể nâng nhiều hơn đều thuộc cùng loại 'mạnh' - một sự phân biệt sai lệch.
Vì vậy, tôi thích định nghĩa:
- Các hệ thống gõ yếu sử dụng các loại để ngăn bạn thực hiện một số việc (như lỗi)
- Hệ thống gõ mạnh sử dụng các loại để làm việc cho bạn
Tôi có ý gì khi làm những điều cho bạn? Chà, hãy kiểm tra việc viết API chuyển đổi hình ảnh trong khung Servant (trong Haskell, nhưng bạn không thực sự cần biết nó để làm theo, bạn sẽ thấy ...)
{-# LANGUAGE
TypeOperators,
DataKinds
#-}
import Codec.Picture
import Data.Proxy
import Network.Wai.Handler.Warp (run)
import Servant
import Servant.JuicyPixels
main :: IO ()
main = run 8001 conversion
Điều này nói rằng chúng tôi muốn một số mô-đun bao gồm gói Servant và plugin JuicyPixels cho Servant và điểm vào chính của chương trình là chạy chức năng 'chuyển đổi' trên cổng 8001 dưới dạng máy chủ sử dụng phụ trợ Warp. Bỏ qua bit ngôn ngữ.
conversion :: Application
conversion = serve (Proxy :: Proxy ConversionApi) handler
Điều này nói rằng chức năng chuyển đổi là một máy chủ trong đó API phải khớp với loại 'ConversApi' và các yêu cầu được xử lý bởi chức năng handler
type ConversionApi
= ReqBody '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] DynamicImage
:> Post '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] DynamicImage
Đây là chỉ định ConvesionApi
loại. Nó nói rằng chúng ta nên chấp nhận các loại nội dung đến được chỉ định bởi danh sách '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] và xử lý chúng dưới dạng DynamicImage và chúng ta sẽ trả lại một DynamicImage được chuyển đổi thành cùng một phạm vi nội dung các loại. Đừng lo lắng chính xác về những gì:> có nghĩa là, bây giờ hãy nghĩ về nó như là phép màu hạnh phúc.
Vì vậy, theo định nghĩa ưa thích của tôi, một hệ thống gõ yếu hiện có thể đảm bảo những thứ như:
- Bạn không trả lại loại nội dung gửi đi sai
- Bạn không phân tích yêu cầu đến là loại nội dung sai
- Nếu máy chủ của chúng tôi phức tạp hơn, nó sẽ ngăn chúng tôi tạo các URI không đúng định dạng, nhưng chúng tôi thực sự không trả lại bất kỳ trang HTML nào để chứa các liên kết (và loại đảm bảo rằng chúng tôi không thể!)
- Một hệ thống gõ yếu thực sự đầy tham vọng thậm chí có thể kiểm tra để đảm bảo rằng chúng tôi xử lý triệt để tất cả các loại nội dung đến và đi, cho phép loại này cũng hoạt động như một tài liệu đặc tả thay vì chỉ là một ràng buộc.
Tất cả các mục tiêu cao cả, nhưng thực sự không đủ để đủ điều kiện là một hệ thống được gõ mạnh, đưa ra định nghĩa trên. Và bây giờ chúng ta phải đi đến phần khó khăn của việc thực sự viết mã tuân theo đặc tả này. Trong một hệ thống loại thực sự mạnh mẽ , chúng tôi viết:
handler = return
Và thế là xong. Đó là nó, không có thêm mã để viết . Đây là một máy chủ web hoạt động đầy đủ (modulo bất kỳ lỗi chính tả nào tôi bỏ qua). Kiểu này đã báo cho trình biên dịch mọi thứ cần thiết để tạo máy chủ web của chúng tôi từ các loại và các gói (mô-đun kỹ thuật) mà chúng tôi đã xác định và nhập.
Vì vậy, làm thế nào để bạn học để làm điều này ở quy mô ứng dụng lớn? Chà, nó thực sự không khác nhiều so với việc sử dụng chúng trong các ứng dụng quy mô nhỏ hơn. Các loại tuyệt đối không quan tâm có bao nhiêu mã được viết liên quan đến chúng.
Chạy kiểm tra loại thời gian là điều mà có lẽ bạn sẽ muốn tránh, bởi vì điều đó sẽ mang lại một lượng lợi ích khổng lồ và cho phép các loại làm cho dự án của bạn trở nên phức tạp hơn để làm việc, thay vì các loại đơn giản hóa mọi thứ.
Như vậy, chủ yếu chỉ là vấn đề thực hành mô hình hóa mọi thứ với các loại. Hai cách chính để mô hình hóa mọi thứ (hoặc xây dựng mọi thứ nói chung) là từ dưới lên và từ trên xuống. Từ trên xuống bắt đầu với mức độ hoạt động cao nhất và khi bạn xây dựng mô hình, bạn có các phần mà bạn đang trì hoãn mô hình cho đến sau này. Mô hình hóa từ dưới lên có nghĩa là bạn bắt đầu với các hoạt động cơ bản, giống như bạn bắt đầu với các chức năng cơ bản, sau đó xây dựng các mô hình lớn hơn và lớn hơn cho đến khi bạn đã nắm bắt hoàn toàn hoạt động của dự án. Từ dưới lên cụ thể hơn và có khả năng xây dựng nhanh hơn, nhưng từ trên xuống có thể thông báo tốt hơn cho các mô hình cấp thấp hơn của bạn về cách chúng cần thực sự hoạt động.
Các loại là cách các chương trình liên quan đến toán học, theo nghĩa đen, vì vậy thực sự không có giới hạn nào về mức độ phức tạp của chúng, hoặc điểm mà bạn có thể 'hoàn thành' khi tìm hiểu về chúng. Hầu như tất cả các nguồn lực bên ngoài các khóa học đại học cấp cao hơn đều dành riêng cho cách các loại hoạt động trong một số ngôn ngữ cụ thể, vì vậy bạn cũng cần phải quyết định điều đó.
Theo cách tốt nhất tôi có thể cung cấp, các loại có thể được phân tầng như vậy:
- Được gõ rất yếu, những thứ như JavaScript trong đó [] + {} được xác định
- Gõ yếu như Python, nơi bạn không thể làm [] + {}, nhưng điều đó không được kiểm tra cho đến khi bạn thử
- Được gõ yếu như C hoặc Java, nơi bạn không thể thực hiện [] + {}, nhưng điều đó đã được kiểm tra vào thời gian biên dịch, tuy nhiên bạn không có các tính năng loại nâng cao hơn
- Điều chỉnh đường viền giữa kiểu gõ yếu và mạnh, chẳng hạn như siêu lập trình mẫu C ++ và mã Haskell đơn giản hơn trong đó các loại chỉ thực thi các thuộc tính.
- Hoàn toàn nhập vào mạnh mẽ, giống như các chương trình Haskell phức tạp hơn, nơi các loại làm việc, như được hiển thị ở trên
- Kiểu được gõ rất mạnh, như Agda hoặc Idris, nơi các loại và giá trị tương tác và có thể ràng buộc lẫn nhau. Điều này mạnh như các hệ thống loại có được, và lập trình trong đó cũng giống như viết bằng chứng toán học về những gì chương trình của bạn làm. Lưu ý: mã hóa trong Agda nó không thực sự viết các bằng chứng toán học, các loại là các lý thuyết toán học và các hàm với các loại đó là các ví dụ mang tính xây dựng chứng minh các lý thuyết đó.
Nói chung, càng đi sâu vào danh sách này, bạn càng có nhiều loại có thể giúp bạn, nhưng đến tận cùng, bạn đang leo lên tầng bình lưu và không khí trở nên hơi mỏng - hệ sinh thái trọn gói nhỏ hơn nhiều và bạn ' tôi sẽ phải tự viết thêm nhiều thứ so với việc tìm thấy một thư viện có liên quan. Rào cản gia nhập cũng tăng cao hơn khi bạn đi xuống, vì bạn phải thực sự hiểu hệ thống loại đủ để viết các chương trình quy mô lớn.