2013-05-27 23 views
7

Tôi không hoàn toàn chắc chắn làm thế nào để yêu cầu này, nhưng là có một cách để hiển thị cấu trúc của một thunk?Bất kỳ cách nào để "hình dung" một thunk/chức năng? Hoặc làm thế nào để xem một chức năng cho một đối số chung

Ví dụ

f x = x + 2 
g x = 3 x 

compo x = f (g x) 

ans = compo 5 
-- result: (3 * 5) + 2 = 17 

Có cách nào tôi có thể "nhìn thấy" các thunk cho ans? Như trong, tôi có thể thấy quá trình giảm beta cho compo hoặc giống như biểu mẫu "chung".

Tôi muốn xem, ví dụ:

compo n 
--> (3 * n) + 2 

Như trong, nếu tôi có một hàm compo x, tôi muốn xem rằng nó bị phân hủy để (3*n)+2.

Ví dụ, trong Mathematica:

f[x_] := x+2; 
g[x_] := 3*x; 
compo[x_] := f[g[x]]; 

compo[n] 
(% 
    --> (3 * n) + 2 
%) 

Trả lời

8

Có gói ghc-vis về hackage hiển thị trực quan của bạn đống và khối không được đánh giá.

Xem package on hackage hoặc Homepage (có chứa các ví dụ khá ấn tượng).

1

Nói chung (chúng ta đang nói về mã Haskell) Tôi nghĩ rằng nó không có ý nghĩa, dòng thunk thức sẽ khác nhau cho dữ liệu đầu vào khác nhau và, mặt khác tay, các hàm được mở rộng một phần (các hàm không chỉ là các biểu thức đơn giản).

Dù sao, bạn có thể mô phỏng nó (nhưng xấu xí)

Prelude> :set -XQuasiQuotes 
Prelude> :set -XTemplateHaskell 
Prelude> import Language.Haskell.TH 
Prelude> import Language.Haskell.TH.Quote 
Prelude> runQ [| $([|\x -> 3 * x|]) . $([|\y -> y + 2|]) |] 
InfixE (Just (LamE [VarP x_0] (InfixE (Just (LitE (IntegerL 3))) (VarE GHC.Num.*) (Just (VarE x_0))))) (VarE GHC.Base..) (Just (LamE [VarP y_1] (InfixE (Just (VarE y_1)) (VarE GHC.Num.+) (Just (LitE (IntegerL 2)))))) 
2

Nếu bạn chỉ muốn xem các chuỗi giảm, bạn có thể thử bằng cách sử dụng trình gỡ lỗi tương tác GHCi. (Nó nằm trong hướng dẫn sử dụng GHC ở đâu đó.) Nó không dễ dàng như trình gỡ lỗi IDE điển hình của bạn, nhưng nó gần như không hoạt động ...

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