2013-11-21 14 views
10

Chức năng reify cho phép tôi tra cứu thông tin về tên đã cho. Đối với hàm, giá trị trả lại là VarI:Làm cách nào để khai báo hàm bằng cách sử dụng `reify`?

data Info = ... | VarI Name Type (Maybe Dec) Fixity | ... 

Ở đây tôi có thể kiểm tra loại của hàm và tôi cũng muốn kiểm tra việc khai báo của hàm. Tuy nhiên, trong đối số thứ 3 là VarI Tôi luôn thấy Nothing. Có cách nào để khai báo chức năng không?

+0

Đó là một câu hỏi hay. Tôi đã thử đánh dấu định nghĩa 'INLINE' hoặc' INLINEABLE' và không tạo ra bất kỳ sự khác biệt nào. Tôi nghi ngờ nó không được thực hiện ở tất cả, nhưng tôi không biết. – Carl

+0

có thể trùng lặp của [Làm thế nào để sử dụng mẫu Haskell để có được cơ thể của hàm?] (Http://stackoverflow.com/questions/13983391/how-to-use-template-haskell-to-get-the-body-of -chức năng) – jberryman

Trả lời

7

Từ template haskell docs on the VarI Info contructor:

A "giá trị" biến (như trái ngược với một biến kiểu, xem TyVarI). Trường Maybe Dec chứa Just tuyên bố đã xác định biến - bao gồm RHS của tờ khai - hoặc khác Nothing, trong trường hợp RHS không khả dụng cho trình biên dịch. Hiện tại, giá trị này là luôn luônNothing: trả lại RHS chưa được triển khai do thiếu sự quan tâm.

Nhìn vào ghc source mirror on github, các string VarI only appears twice, và cả trong compiler/typecheck/TcSplice.lhs thực hiện reifyThing chức năng:

reifyThing :: TcTyThing -> TcM TH.Info 
-- The only reason this is monadic is for error reporting, 
-- which in turn is mainly for the case when TH can't express 
-- some random GHC extension 

reifyThing (AGlobal (AnId id)) 
    = do { ty <- reifyType (idType id) 
     ; fix <- reifyFixity (idName id) 
     ; let v = reifyName id 
     ; case idDetails id of 
      ClassOpId cls -> return (TH.ClassOpI v ty (reifyName cls) fix) 
      _    -> return (TH.VarI  v ty Nothing fix) 
    } 

reifyThing (AGlobal (ATyCon tc)) = reifyTyCon tc 
reifyThing (AGlobal (ADataCon dc)) 
    = do { let name = dataConName dc 
     ; ty <- reifyType (idType (dataConWrapId dc)) 
     ; fix <- reifyFixity name 
     ; return (TH.DataConI (reifyName name) ty 
           (reifyName (dataConOrigTyCon dc)) fix) 
     } 

reifyThing (ATcId {tct_id = id}) 
    = do { ty1 <- zonkTcType (idType id) -- Make use of all the info we have, even 
             -- though it may be incomplete 
     ; ty2 <- reifyType ty1 
     ; fix <- reifyFixity (idName id) 
     ; return (TH.VarI (reifyName id) ty2 Nothing fix) } 

reifyThing (ATyVar tv tv1) 
    = do { ty1 <- zonkTcTyVar tv1 
     ; ty2 <- reifyType ty1 
     ; return (TH.TyVarI (reifyName tv) ty2) } 

reifyThing thing = pprPanic "reifyThing" (pprTcTyThingCategory thing) 

Giống như các tài liệu mẫu Haskell nói, giá trị sử dụng cho lĩnh vực mà luôn luôn là Nothing.

Đào giá rẻ hơn, this code was added in 2003, giống như viết lại hệ thống thống nhất. Vì vậy, nó dường như không được quan tâm nhiều trong việc làm cho nó hoạt động vì nó đã được hơn 10 năm lĩnh vực đó luôn luôn có giá trị Nothing. Vì vậy, tôi đoán nếu bạn muốn các tính năng bạn sẽ phải thực hiện nó cho mình (hoặc đề xuất một trường hợp sử dụng tốt để danh sách gửi thư phát triển ghc mà sẽ khuyến khích người khác làm điều đó).

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