2012-03-14 34 views
12

Tôi đã đọc Learn You a Haskell's guide on the state monad, nhưng tôi đã không hiểu được vì ví dụ ngăn xếp không thể biên dịch được. Trong hướng dẫn, anh đã sử dụng đoạn mã sau đây:Đơn vị tiểu bang và learnyouahaskell.com

import Control.Monad.State 

type Stack = [Int] 

pop :: State Stack Int 
pop = State $ \(x:xs) -> (x,xs) 

push :: Int -> State Stack() 
push a = State $ \xs -> ((),a:xs) 

Trong khi tôi hiểu những gì nó phải làm, nó sẽ không biên dịch. Tôi không biết tại sao. Các thông báo lỗi là:

Stack.hs:6:7: Not in scope: data constructor `State' 

Stack.hs:9:10: Not in scope: data constructor `State' 

Điều này làm cho không có ý nghĩa với tôi, vì "Nhà nước" là, theo tôi biết, trên thực tế một nhà xây dựng dữ liệu, định nghĩa là

newtype State s a = State { runState :: s -> (a,s) } 

Là cơ quan chỉ "sai" và nếu có, làm cách nào để khắc phục?

+5

'Control.Monad.State' không xuất phương thức khởi tạo' State', sử dụng 'state' (với chữ thường' s'). – Vitus

+0

@Vitus Đẹp, tôi không biết [chức năng đó] (http://hackage.haskell.org/packages/archive/transformers/latest/doc/html/Control-Monad-Trans-State-Lazy.html#v : state) đã được xuất. Tôi nghĩ bạn nên viết nó như một câu trả lời chứ không phải là một bình luận. – danr

+0

@Vitus: thật kỳ lạ, bởi vì mã của anh ấy thực sự biên dịch và chạy tốt trên GHCI 6.12.3 của tôi trên các cửa sổ. –

Trả lời

18

Như tôi đã đề cập trong nhận xét, bạn nên sử dụng state thay vì State.


Vấn đề là State không phải là kiểu dữ liệu độc lập (hay đúng hơn là newtype), nhưng nó là biến StateT áp dụng cho Identity đơn nguyên. Trên thực tế, nó được định nghĩa như

type State s = StateT s Indentity 

và bởi vì nó chỉ là type từ đồng nghĩa, nó không thể có State constructor. Đó là lý do tại sao Control.Monad.State sử dụng state.

+0

Nó biên dịch ngay bây giờ :) Tuyệt vời, cảm ơn! – Undreren

+0

Điều này không còn hoạt động. Có ai biết cú pháp đúng không? –

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