Tôi đang cố uốn cong đầu quanh các điểm cố định và các định nghĩa đệ quy.Tại sao `fix` của haskell có vẻ gặp rắc rối với bộ dữ liệu?
này hoạt động:
>>> take 10 $ let x = (0:x) in x
[0,0,0,0,0,0,0,0,0,0]
này làm điều tương tự, có ý nghĩa đưa ra định nghĩa của fix
:
>>> take 10 $ fix (\x -> (0:x))
[0,0,0,0,0,0,0,0,0,0]
Bây giờ giả sử tôi bắt đầu rối tung xung quanh với cặp đệ quy định nghĩa:
>>> take 10 $ fst $ let (u,v) = (0:v,1:u) in (u,v)
[0,1,0,1,0,1,0,1,0,1]
OK, tôi sẽ có thể viết điều đó với fix
quá, phải không?
>>> take 10 $ fst $ fix (\(u,v) -> (0:v,1:u))
*** Exception: <<loop>>
Nhưng nó không hoạt động. Trừ khi tôi thực hiện thay đổi có vẻ nhỏ bé như sau:
>>> take 10 $ fst $ fix (\r -> let (u,v)=r in (0:v,1:u))
[0,1,0,1,0,1,0,1,0,1]
Sự khác biệt quan trọng giữa hai ví dụ cuối cùng là gì?
Phải là '\ (~ (u, v))' hoặc '\ ~ (u, v)' – redneb
@redneb Đã sửa lỗi. (chơi chữ :-P) – chi