Tôi đang cố gắng hiểu sự tiếp tục nói chung sau đây tutorial.Làm thế nào để `get` làm việc trong phiên bản CPS của tiểu bang?
Tuy nhiên, tôi đang gặp khó khăn để hiểu ví dụ sau đây trong phần 2.10:
# let get() =
shift (fun k -> fun state -> k state state) ;;
get : unit => ’a = <fun>
state
là loại int
Tôi cho rằng. Những gì tôi không nhận được là loại k
. Theo hiểu biết của tôi, k
bắt tất cả các tính toán đến sau đó sau khi get()
, và vì chúng ta đang nói về một đơn nguyên nhà nước, k
là hợp lý để đại diện cho một tính toán rằng sẽ được tiếp tục bằng cách lấy một int
, do đó
k : int => 'a
nhưng từ mã này, nó dường như không làm được điều đó và phải mất state
lần thứ hai, mà thực sự ngụ ý:
k : int => int => 'a
nhưng tôi không có được nơi thứ hai đến từ, và trong đó cảm get
là của nhập unit => 'a
thay vì unit => int => 'a
?
So với việc thực hiện đơn nguyên trạng, sự nhầm lẫn cho biết thêm hơn:
newtype StateT s m a = StateT { runStateT :: s -> m (a,s) }
ví dụ: chuyển trạng thái được biểu diễn như một hàm từ nhà nước đến một tuple của kết quả và tiểu bang, mà phù hợp với sự hiểu biết đầu tiên của tôi.
Có ai có thể dẫn đầu không?
Thứ hai, tôi phải triển khai get
tại đây bằng cách sử dụng số Control.Monad.Trans.Cont
của Haskell như thế nào? Tôi đang gặp vấn đề an ủi hệ thống kiểu.
CẬP NHẬT
Có vẻ như tôi đã thứ hai:
Prelude Control.Monad.Trans.Cont> let get() = shift $ \k -> return $ \i -> k i i
Nhưng tôi vẫn không nhận được lý do tại sao tôi cần phải đăng ký nhà nước hai lần để tiếp tục.
@Bergi nó thực sự được gọi là OchaCaml. Tôi đang làm theo hướng dẫn nhưng tôi không nghĩ rằng ngôn ngữ sử dụng tác động đến sự hiểu biết về khái niệm trong trường hợp này. – HuStmpHrrr