Thể hiện chức năng cho ArrowLoop
chứaĐịnh nghĩa này của ArrowLoop.loop hoạt động như thế nào?
loop :: ((b,d) -> (c,d)) -> (b -> c)
loop f b = let (c,d) = f (b,d) in c
Trước tiên tôi có một vấn đề với các chữ ký: Làm thế nào chúng ta có thể có thể có được b -> c
từ (b,d) -> (c,d)
? Tôi có nghĩa là, c
trong tuple kết quả có thể phụ thuộc vào cả hai yếu tố của đầu vào, làm thế nào là nó có thể "cắt" ảnh hưởng của d
?
Thứ hai, tôi không hiểu cách hoạt động của let
tại đây. Không chứa (c,d) = f (b,d)
định nghĩa theo chu kỳ cho d
? Trường hợp nào d
đến từ đâu? Thành thật mà nói, tôi ngạc nhiên đây là cú pháp hợp lệ, vì có vẻ như chúng tôi sẽ định nghĩa lại d
.
Ý tôi là trong toán học, điều này có ý nghĩa, ví dụ: f có thể là một hàm phức tạp, nhưng tôi sẽ chỉ cung cấp phần thực b, và tôi sẽ cần chọn phần ảo d theo cách nó không thay đổi khi tôi đánh giá f (b, d), nó sẽ làm cho nó một số loại điểm cố định. Nhưng nếu tương tự này giữ, biểu thức let
phải bằng cách nào đó "tìm kiếm" cho điểm cố định đó cho d (và có thể có nhiều hơn một). Mà trông gần ma thuật với tôi. Hay tôi nghĩ quá phức tạp?
[Từ khóa hoạt động của từ khóa Haskell hoạt động như thế nào?] (Http://stackoverflow.com/questions/5405850/how-does-the-haskell-rec-keyword-work/5406008#5406008) Câu trả lời đầu tiên trả lời câu hỏi. – fuz