5

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.

+0

@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

Trả lời

3

Bạn áp dụng k trên state gấp đôi vì là người đầu tiên tương ứng với kết quả của get() (chúng tôi muốn get 's hiệu lực thi hành được lấy trạng thái hiện tại và trở về nó như là kết quả) và một trong những thứ hai tương ứng với đi qua tiểu bang sau số get (trong đó, vì get không thay đổi trạng thái, giống như trạng thái trước get) cho phép tính trạng thái tiếp theo.

Nói cách khác, kể từ khi đơn nguyên nhà nước là State s a ~ s -> (a, s), phiên bản CPS của nó là State s r a ~ s -> (a -> s -> r) -> r, và như vậy cho get : State s s, vì a ~ s, việc tiếp tục sẽ là một chức năng của loại s -> s -> r.

+0

đó là phần chính tôi không nhận được. nên tiếp tục là đủ chỉ bằng cách đi qua trạng thái hiện tại đã?tôi cũng không hiểu làm thế nào để bước từ phiên bản monad nhà nước để phiên bản cps. – HuStmpHrrr

+0

cũng làm cách nào tôi có thể biết loại tiếp tục chỉ bằng cách xem mã? phần nào tôi nên nhìn, lỗ hoặc không phải là lỗ? – HuStmpHrrr

+0

Hãy suy nghĩ về những gì bạn muốn vượt qua nếu kết quả của 'get' được cho là trạng thái hiện tại + 1 (sửa nó thành' State Int' vì lợi ích của ví dụ). Trạng thái tiếp theo sẽ vẫn giống như trạng thái đến, nhưng kết quả sẽ khác. Vì vậy, bạn cần phải chuyển 'state + 1' làm đối số kết quả và' state' làm đối số trạng thái mới cho phép tiếp tục. – Cactus

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