2016-10-30 17 views
5

Tôi đang học haskell, và tôi có rất nhiều khó khăn với tinh thần phân tích nhiều biểu thức haskell tôi đi qua. Tất nhiên, tôi hy vọng rằng, với đủ thực hành, phân tích cú pháp haskell sẽ trở thành bản chất thứ hai, nhưng trong khi chờ đợi, để hiểu được những gì tôi gặp phải, tôi muốn tìm một số cách tự động để dịch một biểu thức tùy ý "chuẩn haskell" thành một trong đó tất cả các biểu thức phụ "mơ hồ" đã được loại bỏ bằng cách giới thiệu các dấu ngoặc đơn cần thiết.Làm cách nào để tự động hóa các biểu thức tùy ý haskell?

Ví dụ, nó sẽ dịch các biểu

f g h i 

... vào

((f g) h) i 

..., hoặc

a -> b -> c -> d 

... vào

a -> (b -> (c -> d)) 

..., v.v.

Tốt hơn, đây là công cụ tôi có thể truy cập bằng điện thoại, vì tôi đọc nhiều trên haskell từ một máy tính phù hợp.


Tất nhiên, không có công cụ như vậy có thể có thể làm việc với các nhà khai thác tùy chỉnh không rõ tính cố định và associativity. Bởi "tiêu chuẩn haskell" Tôi có nghĩa là những thứ được định nghĩa trong prelude và trong thư viện haskell tiêu chuẩn.

Tôi đang sử dụng "không rõ ràng" ở đây làm viết tắt cho "không rõ ràng khi không có quy tắc ưu tiên". Ví dụ. 2 + 3 * 5 là mơ hồ trừ khi có một số quy tắc ưu tiên giải quyết câu hỏi về thao tác nào trong hai thao tác sẽ được thực hiện trước tiên.

+0

tôi có thể t 'nghĩ về bất cứ điều gì trên _phone_ của bạn, nhưng có một số điều khá đơn giản bạn có thể làm trong GHCi – Alec

+0

Vâng, [Haskell-src-EXTS] (http: //hackage.haskell. org/package/haskell-src-exts-1.18.2/docs/Language-Haskell-Exts.html) giúp dễ dàng có được một cây phân tích hoàn toàn rõ ràng và in ra. Nhưng nó không thực sự dễ đọc. Hãy thử '(fmap. Fmap. Fmap) (const()) (parseFile" foo.hs ")' từ ghci khi bạn đã cài đặt nó. –

+0

@Alec: tôi có thể làm gì chính xác trong ghci? (về điện thoại: đó chỉ là một sở thích, và nhẹ nhàng ở đó, trong trường hợp có sự lựa chọn trong vấn đề; nếu không có, tôi sẽ sẵn sàng giải quyết cho ghci.) – kjo

Trả lời

9

Nếu bạn thực sự muốn thực hiện công việc, bạn có thể viết hàm TemplateHaskell để làm điều này cho bạn - về cơ bản bạn chỉ cần đi bộ AST và thêm parens theo ý muốn. Tôi bắt đầu làm điều đó, nhưng nhận ra nó sẽ khá dài và tẻ nhạt khá nhanh. Tôi nghĩ rằng nó có thể là thuận tiện hơn cho thời điểm này cho bạn chỉ nghĩ về currying khi nó thực sự đi vào chơi (với các chức năng không được áp dụng đầy đủ).


Tuy nhiên, có một thủ thuật bạn có thể sử dụng cho một subcase của vấn đề của bạn: parens xung quanh các nhà khai thác có tính cố định và associativity bạn không quen thuộc với. Trong GHCi, sau khi khởi động với cờ bên phải, chỉ cần bọc biểu thức bạn quan tâm trong việc kiểm tra trong $([| <expression> |]). Sau đó, bạn sẽ thấy phiên bản biểu thức được lồng tiếng của mình trước kết quả đánh giá nó.

$ ghci -ddump-splices -XTemplateHaskell 
Prelude> $([| 1 + 2^3 * 4 |]) 
<interactive>:1:3-21: Splicing expression 
    [| 1 + 2^3 * 4 |] ======> (1 + ((2^3) * 4)) 
33 
Prelude> $([| 1 <$ pure 4 >>= \x -> const mempty =<< [(+),(*)] <*> [1,2] <* [False] |]) 
<interactive>:2:3-77: Splicing expression 
    [| 1 <$ pure 4 
     >>= 
     (\ x_a6PT -> const mempty =<< [(+), (*)] <*> [1, 2] <* [False] |] 
    ======> 
    ((1 <$ (pure 4)) 
    >>= 
     (\ x_a6PT 
      -> ((const mempty) =<< (([(+),(*)] <*> [1,2]) <* [False])))) 
[] 
Prelude> 

Tuy nhiên, điều này chắc chắn sẽ không khắc phục chữ ký hoặc ứng dụng chức năng theo cách bạn muốn.

4

Đó không phải là chính xác những gì bạn đang yêu cầu, nhưng tôi đã tìm thấy bằng HLint để cảnh báo tôi về dấu ngoặc không cần thiết khi tôi viết Haskell là một trợ giúp lớn khi tôi đọc.

Bạn cũng có thể tìm thấy biểu đồ ở trang 23 của Bernie Pope's "A tour of the Haskell Prelude" hữu ích. Tôi đã bao gồm một bản sao bên dưới.

page 23 of Bernie Pope's "A tour of the Haskell Prelude"

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