Tôi hiện đang có một cấu trúc như sau:Ngăn chặn các phương pháp mặc định lẫn nhau đệ quy từ vòng lặp tại thời gian chạy
class F a where
f :: ...
default f :: (G a...) => ...
f = (some definition in terms of g)
class F a => G a where
g :: ...
default g :: (C a...) => ...
g = (some definition in terms of f)
Trong tiếng Anh hy vọng phần nào đơn giản, tôi có thể viết f
về g
luôn. Tôi có thể viết g
theo điều khoản của f
đôi khi, cụ thể là khi a
thỏa mãn ràng buộc C
.
Vấn đề tôi thấy ở đây là nếu ai đó viết, cho biết một loại T
đáp ứng C T
instance F T
instance G T
này sẽ biên dịch và vòng lặp khi chạy. Mặc dù cả hai định nghĩa mặc định là chính xác nhưng điều quan trọng là ít nhất một định nghĩa được xác định.
Tôi có thể giải quyết vấn đề này với MINIMAL
pragma nếu f
và g
thuộc cùng một lớp, nhưng trong trường hợp này thì không.
Cũng đặt cả f
và g
cùng lớp dường như không thể, như khi có một định nghĩa về f
cho mỗi định nghĩa của g
, không có một định nghĩa về g
cho mỗi định nghĩa của f
. Một khả năng là di chuyển g
vào F
nhưng cũng đặt một ràng buộc C a
vào nó, nhưng điều đó sẽ ngăn tôi xác định g
với định nghĩa không mặc định cho bất kỳ a
nào không đáp ứng C a
.
Có cách nào để tổ chức lại điều này để giải quyết tình huống khó xử này mà tôi đang gặp phải không?
Một tùy chọn dự phòng khác sẽ không có định nghĩa mặc định là 'g' và/hoặc' f', mà thay vào đó cung cấp chức năng độc lập mà người viết thể hiện có thể sử dụng triển khai "mặc định" (bằng cách viết 'g = defaultG'). Hy vọng rằng ít nhất làm cho nó một chút khó khăn hơn để * vô tình * để lại cả hai như mặc định, vì ít nhất một là một sự lựa chọn có chủ ý. – Ben