Ví dụ: giả sử tôi muốn triển khai hàm tổng hợp danh sách Num
s. Nửa chừng mã hóa nó, tôi muốn gỡ lỗi nó với Debug.Trace
:Có thể ép buộc loại cho một lớp trong Haskell không?
module T where
import Debug.Trace
dosum :: (Num a) => [a] -> a
dosum xs = dosum' 0 xs
where
dosum' n [] = n
dosum' n (x:xs) = trace (show n) $ dosum' (n+x) xs
Vấn đề là điều này sẽ không biên dịch:
Could not deduce (Show a) arising from a use of dosum'
from the context (Num a)
tôi có thể thêm (Show a)
để dosum
và sau đó loại bỏ nó khi tôi đã hoàn thành gỡ lỗi (trong cuộc sống thực, tôi sẽ muốn có một loại mà không nhất thiết phải trong Show
, nhưng tôi sẽ gỡ lỗi với số nguyên). Điều này có thể trở nên rườm rà nếu có một vài chức năng liên quan và tôi tiếp tục thêm việc xóa các câu lệnh Show a
.
Tôi muốn có một hàm unsafeShow
unsafeShow :: a -> String
mà hoạt động nếu a
là Show a
và là miễn phí để sụp đổ nếu nó không phải là. Điều này có thể không?
Bạn có thể nhận xét chữ ký trong khi gỡ lỗi. –
@DanielFischer: vấn đề là nếu dosum là ở dưới cùng của một ngăn xếp, tôi kết thúc bình luận/uncommenting nhiều chức năng tất cả các thời gian và nó rất khó chịu. – luispedro
Có lẽ (?) Ít xấu hơn: '#ifdef DEBUG' –