2016-11-21 17 views
5

Tôi không biết làm thế nào tôi thực hiện nó và tôi giả định rằng có thể không có cách nào để làm điều đó. Có một bằng chứng hoặc một lập luận thuyết phục rằng nó không thể được thực hiện?Tại sao không có trường hợp `MonadTransControl` cho` ContT`

Điều gì làm cho ContT trở nên đặc biệt?

+2

Tôi tính các nhận xét này [ở định nghĩa 'ContT'] (https://hackage.haskell.org/package/transformers-0.5.2.0/docs/Control-Monad-Trans-Cont.html#t:ContT) là có liên quan: "' ContT' không phải là một functor trên thể loại của monads, và nhiều hoạt động không thể được dỡ bỏ thông qua nó ". Bạn thậm chí không cần 'm' là' Monad' để có 'Monad (ContT k r m)'! – Alec

+0

@Alec Điều đó chắc chắn làm cho nó kỳ lạ, nhưng nó không kết nối nó với 'MonadTransControl' –

Trả lời

2

Điều duy nhất bạn có thể thoát khỏi một số ContT r m là giá trị loại m r. Các loại chữ ký của Run (ContT r) sẽ

Run (ContT r) = forall n b. Monad n => ContT r n b -> n (StT (ContT r) b) 

tương đương với

forall n b. ((b -> n r) -> n r) -> n (StT (ContT r) b) 

duy nhất loại có thể cho StT (ContT r) br, nhưng thậm chí sau đó, không có chức năng được xác định có thể có của loại b -> n r để vượt qua để số ContT. Và kể từ liftWith được cung cấp một chức năng yêu cầu giá trị loại Run (ContT r), nó không thể được thực hiện.

restoreT làm cho nó thậm chí còn tồi tệ hơn, bởi vì bất kỳ giá trị nào có thể được trích xuất từ ​​một số ContT r m a chung không thể được chuyển trở lại thành ContT r m a. Vì vậy, bạn mất cả hai đến và đi.

Ngẫu nhiên, đây cũng là lý do bạn không thể thực hiện ContT a MonadFix. Bạn không thể biến một tuỳ ý a thành một tùy ý r và ngược lại.

Các vấn đề liên quan