Gõ suy luận trong Golang / Haskell


9

Tôi đã đọc rằng Go thực sự không có suy luận kiểu thực sự theo nghĩa các ngôn ngữ chức năng như ML hoặc Haskell có, nhưng tôi không thể tìm thấy một so sánh đơn giản để hiểu hai phiên bản. Ai đó có thể giải thích bằng các thuật ngữ cơ bản về cách suy luận kiểu trong Go khác với suy luận kiểu trong Haskell và ưu / nhược điểm của từng loại không?

Câu trả lời:


13

Xem câu trả lời StackOverflow này liên quan đến suy luận kiểu Go. Bản thân tôi không quen với Go nhưng dựa trên câu trả lời này có vẻ như là "loại trừ" một chiều (để mượn một số hình thái học C ++). Nó có nghĩa là nếu bạn có:

x := y + z

sau đó loại xđược suy ra bằng cách tìm ra loại y + z, đó là một điều tương đối tầm thường để làm cho trình biên dịch. Để làm điều này, các loại yzcần được biết đến một tiên nghiệm : điều này có thể được thực hiện thông qua các chú thích loại hoặc suy ra từ các nghĩa đen được gán cho chúng.


Ngược lại, hầu hết các ngôn ngữ chức năng có kiểu suy luận sử dụng tất cả thông tin có thể có trong một mô-đun (hoặc hàm, nếu thuật toán suy luận là cục bộ) để rút ra loại biến. Các thuật toán suy luận phức tạp (như Hindley-Milner) thường liên quan đến một số dạng thống nhất loại (hơi giống như giải phương trình) đằng sau hậu trường. Ví dụ: trong Haskell, nếu bạn viết:

let x = y + z

sau đó Haskell có thể suy ra loại không chỉ xmà còn yzđơn giản dựa trên thực tế là bạn đang thực hiện bổ sung trên chúng. Trong trường hợp này:

x :: Num a => a
y :: Num a => a
z :: Num a => a

(Chữ thường aở đây biểu thị một loại đa hình , thường được gọi là "generic" trong các ngôn ngữ khác như C ++. Phần Num a =>này là một ràng buộc để chỉ ra rằng ahỗ trợ loại có một số khái niệm bổ sung.)

Đây là một ví dụ thú vị hơn: bộ kết hợp điểm cố định cho phép xác định bất kỳ hàm đệ quy nào:

let fix f = f (fix f)

Lưu ý rằng không nơi nào chúng tôi đã chỉ định loại f, chúng tôi cũng không chỉ định loại fix, nhưng trình biên dịch Haskell có thể tự động tìm ra rằng:

f :: t -> t
fix :: (t -> t) -> t

Điều này nói rằng:

  • Tham số fphải là một hàm từ một số loại tùy ý tđến cùng loại t.
  • fixlà một hàm nhận một tham số của kiểu t -> tvà trả về kết quả của kiểu t.

4
chính xác hơn, Haskell có thể nói rằng x, y, zđều giống nhau Numloại eric, nhưng họ vẫn có thể được Integers, Doubles, Ratio Integers ... Haskell là sẵn sàng để thực hiện một sự lựa chọn tùy ý giữa các loại số, nhưng không phải cho typeclasses khác.
John Dvorak

7

Kiểu suy luận trong Go cực kỳ hạn chế và cực kỳ đơn giản. Nó chỉ hoạt động trong một cấu trúc ngôn ngữ (khai báo biến) và nó chỉ đơn giản lấy kiểu của phía bên phải và sử dụng nó làm kiểu cho biến ở phía bên trái.

Kiểu suy luận trong Haskell có thể được sử dụng ở mọi nơi, nó có thể được sử dụng để suy ra các loại cho toàn bộ chương trình. Nó dựa trên sự thống nhất, có nghĩa là (về mặt khái niệm) tất cả các loại được suy ra "cùng một lúc" và tất cả chúng có thể ảnh hưởng lẫn nhau: trong Go, thông tin loại chỉ có thể chảy từ phía bên phải của một khai báo biến sang bên trái- bên tay, không bao giờ theo hướng khác và không bao giờ bên ngoài một tuyên bố biến; trong Haskell, nhập thông tin tự do theo mọi hướng thông qua toàn bộ chương trình.

Tuy nhiên, hệ thống loại của Haskell mạnh đến mức suy luận kiểu thực sự có thể không suy ra một loại (hay chính xác hơn: các hạn chế phải được đặt ra để một loại luôn có thể được suy ra). Hệ thống loại của Go rất đơn giản (không phân nhóm, không đa hình tham số) và suy luận của nó bị hạn chế đến mức nó luôn thành công.


4
"Trong Haskell, nhập thông tin tự do theo mọi hướng trong toàn bộ chương trình": Tôi thấy điều này mang lại một trực giác rất tốt. +1
Giorgio

Các tuyên bố mà câu trả lời này đưa ra trong đoạn cuối là một chút sai lệch. Haskell không có phân nhóm. Hơn nữa, đa hình tham số không gây ra bất kỳ vấn đề nào cho tính hoàn chỉnh của suy luận kiểu: Hindley-Milner trên phép tính lambda đa hình luôn tìm thấy loại tổng quát nhất. Haskell có thể không suy ra các loại, nhưng điều này sẽ có trên các tính năng hệ thống loại tinh vi như GADT, khi mà công thức ngây thơ, không tồn tại loại chính (nghĩa là "lựa chọn tốt nhất").
Edward Z. Yang
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.