Tại sao haskell yêu cầu nhiều quy tắc viết lại tùy thuộc vào kỹ thuật và chiều dài thành phần chức năng? Có cách nào để tránh điều này không?Quy tắc viết lại Haskell và thành phần chức năng
Ví dụ, với đoạn mã sau ...
{-# RULES
"f/f" forall a. f (f a) = 4*a
#-}
f a = 2 * a
này làm việc cho
test1 = f (f 1)
tuy nhiên chúng ta cần thêm một quy tắc cho
test2 = f . f $ 1
và
test3 = f $ f 1
lại cho chúng tôi với các quy tắc sau
{-# RULES
"f/f1" forall a. f (f a) = 4 * a
"f/f2" forall a. f . f $ a = 4 * a
"f/f3" forall a. f $ f $ a = 4 * a
#-}
Tuy nhiên, khi chúng tôi chuỗi này lại với nhau hoặc sử dụng một số hình thức khác của thành phần các quy tắc không bắn.
test4 = f . f . f $ 1
test5 = f $ f $ f $ 1
test6 = f $ 1
Tại sao điều này? Tôi có phải viết các quy tắc viết lại cho mọi triển khai có thể không?
Tôi thực sự không biết, nhưng tôi đoán đó là vì quy tắc viết lại không áp dụng cho các hàm bạn đã nhập. Và '$' và '.' chỉ là các hàm được nhập từ Prelude. –