2010-04-23 23 views
20

Tôi mới tham gia lập trình funcctional và có một số câu hỏi liên quan đến cách viết mã và gỡ lỗi.Gỡ lỗi mã F # và kiểu chức năng

Tôi có ấn tượng rằng người ta nên tránh lưu trữ kết quả từ các cuộc gọi funcction trong một biến temp và sau đó trở biến mà

ví dụ

let someFunc foo = 
    let result = match foo with 
       | x -> ... 
       | y -> ... 
    result 

Và thay vì làm điều đó như thế này (tôi có thể là đường tắt?):

let someFunc foo = 
    match foo with 
    | x -> ... 
    | y -> ... 

nào hoạt động tốt từ góc độ functionallity, nhưng nó làm cho nó theo cách khó khăn hơn để gỡ lỗi. Tôi không có cách nào để kiểm tra kết quả nếu mặt bên phải của -> thực hiện một số nội dung thú vị.

Vậy làm cách nào để xử lý loại kịch bản này?

Trả lời

11

Dù bằng cách nào có thể chấp nhận, như bạn chỉ đơn giản là ràng buộc để biến bất biến địa phương.

Có một điểm bắt. Nếu bạn sử dụng nó như là một phần của một vòng lặp đệ quy bằng cách sử dụng các cuộc gọi đuôi, một trong những bằng cách sử dụng biến temp sẽ loại bỏ các cuộc gọi đuôi, và do đó bạn sẽ có sự gia tăng trong không gian ngăn xếp.

+0

Cảm ơn, không biết rằng nó phá vỡ đệ quy đuôi. Tôi đoán tôi cần phải loại bỏ các biến kết quả đó. Tôi đang đùa giỡn với cú pháp C LISP ngay bây giờ; http://rogeralsing.com/2010/04/17/more-on-plastic/ Nó sẽ soo đánh bại IronScheme ;-) –

4

Tôi sẽ không bắn bạn nếu bạn sử dụng nhiệt độ, nhưng tôi cũng sẽ không làm giảm phong cách của tôi trên cơ hội ra rằng tôi cần phải xem một cái gì đó dưới gỡ lỗi.

Bên cạnh đó, gỡ lỗi loại điều này dễ dàng hơn nhiều với trình gỡ lỗi trực quan của Visual Studio 2010, vì bạn có thể sử dụng các điểm ngắt bên trong mỗi biểu thức khớp có thể. Ngoài ra còn có đồng hồ nhanh và các tính năng tuyệt vời khác.

Đối với một danh sách các tính năng mới nhất trong debugger Visual Studio: http://msdn.microsoft.com/en-us/library/01xdt7cs.aspx

4

Có thể thấy giá trị trả lại của hàm trong VS là yêu cầu lâu dài. Các giá trị biểu thức trung gian khác nữa; trong F # chẳng hạn, bạn thường muốn kiểm tra giữa đường ống, điều này khó thực hiện. Theo nghĩa là lập trình chức năng có nghĩa là "ít biến được đặt tên và người dân địa phương" và "biểu thức lớn hơn", điều này không có tác động tiêu cực đến thế hệ gỡ rối hiện tại. (Mặt khác, với những thứ như ít mutability và trừu tượng cao hơn, hy vọng bạn dành ít thời gian trong trình gỡ lỗi.)

Vẫn còn nhiều cách gỡ rối trong tương lai có thể được cải thiện ...

Xem cũng

Do some Functional programming constructs reduce Debuggability?

20

Kiểm tra giữa một đường ống, tôi đề nghị thực hiện giải pháp sau đây:

Đặt mã này ở một số nơi:

[<AutoOpen>] 
module AutoOpenModule 

#if DEBUG 
let (|>) value func = 
    let result = func value 
    result 
#endif 

Enable "Bước vào Properties và nhà khai thác trong Managed Code":

https://msdn.microsoft.com/en-us/library/cc667388(v=vs.100).aspx

Bây giờ bạn sẽ có thể bước vào các nhà điều hành đường ống dẫn.

+0

Hoàn toàn rực rỡ. Điều này bây giờ là một bổ sung ấp ủ cho codebase của chúng tôi. – Kit