Câu hỏi này không chủ quan. Một động từ rất cụ thể được sử dụng trong cuốn sách được tham khảo và tôi muốn hiểu ý nghĩa của cụm từ đó là gì, bởi vì tôi sợ tôi hiểu nhầm điều gì đó.
Từ Tìm hiểu bạn một Haskell , đoạn văn sau là đoạn thứ ba và cuối cùng có chứa "chúng tôi giả định *
".
data Barry t k p = Barry { yabba :: p, dabba :: t k }
Và bây giờ chúng tôi muốn làm cho nó một ví dụ
Functor
.Functor
muốn các loại loại* -> *
nhưngBarry
không có vẻ như nó có loại đó. Các loại làBarry
gì? Vâng, chúng tôi thấy nó có ba tham số loại, vì vậy nó sẽ đượcsomething -> something -> something -> *
. Thật an toàn khi nói rằng đóp
là một loại cụ thể và do đó có một loại*
. Đối vớik
, chúng tôi giả định*
và do đó bằng cách mở rộng,t
có một loại* -> *
. Bây giờ, hãy thay thế các loại đó bằng các loạisomething
mà chúng tôi đã sử dụng làm trình giữ chỗ và chúng tôi thấy nó có một loại(* -> *) -> * -> * -> *
.
Tại sao chúng ta lại giả định bất cứ điều gì? Khi đọc "chúng tôi giả sử X (tức là chúng tôi cho rằng X là đúng)", tôi nghĩ rằng chúng ta cũng nên xem xét trường hợp X là sai. Trong trường hợp cụ thể của ví dụ, không t
thể là loại (* -> *) -> *
và k
loại (* -> *)
? Nếu đây là trường hợp, bất cứ điều gì t
và k
thực sự là, t k
vẫn sẽ là một loại cụ thể, phải không?
Tôi thấy rằng toàn bộ dòng lý luận sau đó được kiểm tra đối với trình biên dịch, nhưng tôi không nghĩ trình biên dịch giả định . Nếu có, tôi muốn biết điều gì, nếu không thì tôi lại sợ rằng tôi thiếu ý nghĩa của đoạn văn.
k :: L
cho bất kỳ loại nàoL
, miễn làt :: L -> *
. Tuy nhiên, một trình biên dịch ở đây phải chọn một số cụ thểL
hoặc sử dụng một polykind. Một polykind sẽ là tùy chọn chung nhất, nhưng ở đây GHC chọnL = *
(Haskell cơ bản không có polykind, chúng phải được bật như một phần mở rộng). Vì nó chọn một cái gì đó khá độc đoán, LYAH sử dụng từ "giả định" (AFAICT).