2010-02-15 52 views
16

Tôi đang học thư viện mtl và cố gắng thực hiện một số MonadTransformers của riêng tôi. Tôi đã kiểm tra việc kê khai Control.Monad.State.StateT, và trên tất cả các mã, tôi thấy cú pháp sau:`~` có nghĩa là gì trong Haskell?

execStateT :: (Monad m) => StateT s m a -> s -> m s 
execStateT m s = do 
    ~(_, s') <- runStateT m s 
    return s' 

không ~ toán hạng này có ý nghĩa gì?

Trả lời

14

Đây là ký hiệu cho mẫu lười trong Haskell. Tôi không thể nói rằng tôi quen thuộc với nó nhưng from here:

Nó được gọi là mẫu lười và có biểu mẫu ~ pat. Mẫu kẻ lười là không thể chối cãi: khớp với một giá trị v chống lại ~ pat luôn thành công, bất kể vỗ. Hoạt động nói, nếu số nhận dạng trong pat là sau "được sử dụng" ở bên phải, , nó sẽ được ràng buộc với phần đó là giá trị sẽ là kết quả nếu v là để khớp thành công pat và ⊥ nếu không thì.

Ngoài ra, this section có thể hữu ích.

4

Đó là tương đương với

execStateT m s = do 
    r <- runStateT m s 
    return (snd r) 

hoặc

execStateT m s = 
    runStateT m s >>= return . snd 
7

Đối với một mô hình phù hợp bình thường, giá trị đó phải được xuất hiện cần phải được đánh giá, do đó nó có thể được so sánh với mô hình.

~ biểu thị một mẫu phù hợp lười biếng: Chỉ giả định rằng giá trị sẽ khớp với mẫu. Trận đấu sau đó chỉ được thực hiện sau, nếu giá trị của một biến phù hợp thực sự được sử dụng.