2017-04-07 12 views
7

Gần đây tôi đã bắt đầu xem các thư viện lõi trên Hackage, và có một thành ngữ định kỳ mà tôi không hiểu. Dưới đây là ví dụ từ số ST module:cú pháp của khai báo ST monad

instance Monad (ST s) where 
    {-# INLINE (>>=) #-} 
    (>>) = (*>) 
    (ST m) >>= k 
     = ST (\ s -> 
     case (m s) of { (# new_s, r #) -> 
     case (k r) of { ST k2 -> 
     (k2 new_s) }}) 

Cụ thể, tôi không hiểu (# new_s, r #). Tôi giả định băm thứ hai đề cập đến một giá trị unboxed, nhưng phần còn lại là một bí ẩn đối với tôi (một cái gì đó để làm với "nhà nước mới", có lẽ).

Trả lời

7

(# x, y, z #) là một bộ dữ liệu không có hộp với ba phần tử. Xem "8.2.2. Bộ sưu tập không có hộp" tại https://downloads.haskell.org/~ghc/6.8.3/docs/html/users_guide/primitives.html.

Phần còn lại về cơ bản chỉ là triển khai của Nhà nước.

+3

Nói chung, '#' trong Haskell có nghĩa là nó đang làm một số loại cấp độ thấp và/hoặc nguyên thủy. Bạn phải bật phần mở rộng ngôn ngữ 'MagicHash' để thậm chí sử dụng' # 'trong tên. – Lazersmoke

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