Tôi đang đọc Purescript theo ví dụ và nhận phần giới thiệu đơn vị Reader. Ví dụ như sau:Tìm hiểu về trình đơn Reader
createUser :: Reader Permissions (Maybe User)
createUser = do
permissions <- ask
if hasPermission "admin" permissions
then map Just newUser
else pure Nothing
Phần khó hiểu đối với tôi là chức năng ask
. Chữ ký là:
ask :: forall r. Reader r r
Có vẻ như nếu nó tạo ra một đầu đọc ra khỏi không khí mỏng
Khi tôi đang đọc về State
đơn nguyên, nó có khái niệm tương tự với chức năng get
của nó. Và văn bản được giải thích:
trạng thái được triển khai dưới dạng đối số hàm ẩn bởi hàm tạo dữ liệu của đơn vị nhà nước, vì vậy không có tham chiếu rõ ràng nào để truyền xung quanh.
Tôi đoán này là chìa khóa, và điều tương tự đang xảy ra ở đây với Reader, nhưng tôi không hiểu tại sao nó hoạt động ...
Khi ví dụ trên được điều hành qua runReader
, làm thế nào giá trị được cung cấp có đột nhiên xuất hiện như là kết quả của ask
không? Tài liệu Haskell cho số ask
nói: Truy xuất môi trường đơn lẻ. Nhưng sự nhầm lẫn của tôi là từ nơi? Cách tôi nhìn thấy nó, một giá trị được chuyển đến runReader
, được lưu trữ ở đâu đó và để có được nó - bạn gọi ask
... nhưng điều đó không có ý nghĩa.
Trong khi ví dụ này là Purescript, tôi đoán bất kỳ người nào biết chữ Haskell cũng sẽ có thể trả lời, do đó thẻ Haskell.
'Đọc b' là một trình bao bọc quanh' a -> b'. Vì vậy, 'ask :: forall a. Đọc a' là cuối cùng chỉ là một giá trị của loại 'forall a. a -> a', với một wrapper xung quanh nó. –