Tôi đã chơi với Cloud Haskell. Tôi đã nhận thấy in the hackage documentation có một loại giao diện ứng dụng. Nhưng đặc biệt là tôi đang cố gắng tìm hoặc viết một hàm closurePure
với chữ ký sau:Cloud Haskell - Cách viết "thuần túy" cho Đóng cửa?
closurePure :: (Typeable a, Binary a) => a -> Closure a
Đây là phiên bản giới hạn của thuần túy.
Trong khi Closure
datatype chính nó là trừu tượng, closure
sau cung cấp:
closure :: Static (ByteString -> a) -> ByteString -> Closure a
Vì vậy, tôi có thể có được điều này cho đến nay:
closurePure :: (Typeable a, Binary a) => a -> Closure a
closurePure x = closure ??? (encode x)
Vấn đề là những gì để đặt nơi ???
s là.
nỗ lực đầu tiên của tôi là như sau:
myDecode :: (Typeable a, Binary a) => Static (ByteString -> a)
myDecode = staticPtr (static decode)
Nhưng khi đọc GHC docs on static pointers, ví dụ show
gợi ý với tôi rằng bạn không thể có một hạn chế vì một chức năng hạn chế không có một trường hợp Typeable
. Vì vậy, tôi đã cố gắng làm việc xung quanh đề nghị sử dụng Dict
:
myDecode :: Typeable a => Static (Dict (Binary a) -> ByteString -> a)
myDecode = staticPtr (static (\Dict -> decode))
Nhưng bây giờ tôi đã có loại sai mà không phù hợp với closure
chức năng trên.
Có cách nào để viết closurePure
hoặc một cái gì đó tương tự (hoặc tôi đã bỏ lỡ nó trong tài liệu Cloud Haskell) không? Nâng các loại đồng bằng binary
lên Closure
s có vẻ cần thiết khi sử dụng giao diện được áp dụng, nhưng tôi không thể tìm ra cách thực hiện.
Lưu ý rằng tôi có thể làm điều này:
class StaticDecode a where
staticPtrDecode :: StaticPtr (ByteString -> a)
instance StaticDecode Int where
staticPtrDecode = static Data.Binary.decode
instance StaticDecode Float where
staticPtrDecode = static Data.Binary.decode
instance StaticDecode Integer where
staticPtrDecode = static Data.Binary.decode
-- More instances etc...
myPure :: forall a. (Typeable a, StaticDecode a, Binary a) => a -> Closure a
myPure x = closure (staticPtr staticPtrDecode) (encode x)
nào hoạt động tốt nhưng về cơ bản đòi hỏi tôi phải lặp lại một ví dụ cho mỗi Binary
dụ. Có vẻ như lộn xộn và tôi thích cách khác.
Bạn có chắc 'myDecode = staticPtr (giải mã tĩnh)' không hoạt động không? Dường như với tôi rằng bạn vừa giao dịch ràng buộc 'Binary' cho một ràng buộc' StaticDecode', nhưng bạn nói nó đang hoạt động. – 4castle
Xin lỗi, hàm cuối cùng nên được gọi là 'myPure', không phải' myDecode'. Hy vọng rằng có ý nghĩa hơn. Nhưng theo nghĩa bạn đúng, nhưng bên trong thể hiện 'StaticDecode' tôi gọi tĩnh (hoạt động) nhưng khi tôi lấy' decode' đầu tiên từ thể hiện nhị phân thì áp dụng static nó không thành công. Tôi đoán (điều này hoàn toàn là phỏng đoán) rằng mỗi cá thể của 'StaticDecode' tạo ra một con trỏ tĩnh duy nhất để nó hoạt động tốt. – Clinton