2011-07-29 41 views
38

tôi sử dụng để viếtCó trình định dạng mã Haskell không?

data A = A { 
     a :: Double 
    } 
    deriving(Eq, Show) 

nhưng bây giờ tôi thích

data A = A { 
     a :: Double 
    } deriving(Eq, Show) 

Tôi nghĩ rằng câu trả lời sẽ là không, nhưng tôi yêu cầu nào: là có một định dạng mã cho Haskell?

+0

Một vài năm muộn nhưng hiện tại không có hiện tượng hindent, tôi đã cập nhật câu trả lời chấp nhận của mình với nó. –

+0

kiểm tra brittany –

Trả lời

52

câu trả lời mới

bây giờ tôi đã viết hindent, được viết về haskell-src-exts. Nó có hỗ trợ Emacs và Vim.


Cũ câu trả lời

haskell-src-exts mà sẽ phân tích mã của bạn và nó có một module in khá để in AST thành một chuỗi. Ví dụ.

import Language.Haskell.Exts 

main = interact codeFormat 

codeFormat = check . fmap reformat . parseModuleWithComments where 
    reformat = prettyPrint 
    check r = case r of 
       ParseOk a -> a 
       ParseFailed loc err -> error $ show (loc,err) 

Ví dụ:

λ> putStrLn $ codeFormat "module X where x = 1 where { y 1 = 2; y _ = 2 }" 
module X where 
x = 1 
    where y 1 = 2 
     y _ = 2 

Hoặc bạn có thể viết một máy in khá chính mình (thậm chí dựa trên trên nếu bạn chỉ muốn chuyên), và sau đó bạn có thể có bất cứ điều gì theo phong cách mà bạn muốn. Thay thế prettyPrint bằng của riêng bạn. AST rất thẳng về phía trước.

Sau đó, bạn có thể kết nối nó với Emacs để định dạng lại mỗi khi bạn nhấn lưu hoặc một cái gì đó.

+8

đặt điều này trong dấu nhắc ~./Ghci:: set "λ>" – gawi

+0

Mã của bạn không nhập-kiểm tra với haskell-src-exts-1.13.5. Ngoài ra, có cách nào để in đẹp nó bao gồm cả các bình luận không? –

+0

mã có thể được kiểm tra loại nếu bạn thay đổi chức năng phân tích cú pháp khác, nhưng dường như không có hỗ trợ để giữ lại nhận xét trong nguồn, chỉ thu thập nhận xét vào danh sách, không biết tại sao lại hữu ích khi thực hiện điều đó. – Sawyer

2

Để in một AST với ý kiến ​​bạn sẽ cần ExactPrint

exactPrint :: ExactP ast => ast SrcSpanInfo -> [Comment] -> String 

nhưng exactPrint sẽ không đẹp in nguồn của bạn.

Tôi đã viết a small tool bạn có thể gọi nó bằng Vim làm trình định dạng bên ngoài.

prettyHS :: String -> String 
prettyHS src 
    = case parseFileContentsWithComments defaultParseMode src of 
     ParseOk (ast, _) -> prettyPrint ast 
     _ -> src 
Các vấn đề liên quan