Tôi có một tập hợp các biểu thức lambda mà tôi chuyển sang các lambdas khác. Tất cả lambdas chỉ dựa vào lập luận của chúng, chúng không gọi bất kỳ chức năng bên ngoài nào. Tất nhiên, đôi khi nó khá khó hiểu và tôi sẽ chuyển một hàm với số lượng đối số không chính xác sang một đối số khác, tạo ra một ngoại lệ GHCi.Haskell gỡ lỗi biểu thức lambda tùy ý
Tôi muốn tạo một hàm gỡ lỗi sẽ nhận biểu thức lambda tùy ý (với số lượng đối số không xác định) và trả về chuỗi dựa trên cấu trúc và hàm của lambda.
Ví dụ, nói tôi có biểu thức lambda sau:
i = \x -> x
k = \x y -> x
s = \x y z -> x z (y z)
debug (s k)
nên trở "\a b -> b"
debug (s s k)
nên trở "\a b -> a b a"
(nếu tôi đơn giản mà chính xác)
debug s
nên trở "\a b c -> a c (b c)"
Wha t sẽ là một cách tốt để làm điều này?
Không thực sự ở Haskell, loại thông tin này sẽ bị xóa tại thời gian biên dịch. Bạn có thể sử dụng mẫu haskell để thực hiện nó, có thể, nhưng điều đó không đơn giản. – bheklilr
Có rất nhiều tài nguyên để triển khai phép tính lambda ngoài đó. [TaPL] (http://www.cis.upenn.edu/~bcpierce/tapl/) là một đặc biệt tốt, và bao gồm việc triển khai tính toán các mức độ tinh tế khác nhau. Dường như có một số triển khai nhỏ trên Hackage mà bạn có thể chơi cùng. –
Haskell là ngôn ngữ được nhập tĩnh. Nó thực sự không liên quan sâu sắc đến tính toán lambda, ngoại trừ trong trường hợp lambdas xảy ra là một cách hữu ích để viết các biểu thức của một thể loại đóng cửa Descartes. Nhưng sẽ hiệu quả hơn khi trực tiếp sử dụng các loại để có được ý tưởng về chức năng của một hàm, thay vì xem xét một số biểu thức lambda tương đương. Đối với những gì bạn đang cố gắng đạt được, một ngôn ngữ như Scheme sẽ phù hợp hơn. – leftaroundabout