2012-03-24 51 views
20

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?

+4

[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

Trả lời

14

này hoạt động theo cùng một cách định nghĩa tiêu chuẩn của fix công trình:

fix f = let x = f x in x 

ví dụ, nó tìm một điểm cố định trong exact same way fix does: đệ quy. Ví dụ:

Ví dụ như một ví dụ nhỏ, hãy xem xét loop (\((),xs) -> (xs, 1:xs))(). Điều này giống như fix (\xs -> 1:xs); chúng tôi bỏ qua đầu vào của chúng tôi, và sử dụng đầu ra d (ở đây xs) làm đầu ra chính của chúng tôi. Phần tử phụ trong bộ dữ liệu loop chỉ chứa tham số đầu vào và giá trị đầu ra, vì các mũi tên không thể làm currying được. Xem xét cách bạn muốn xác định hàm giai thừa với fix - bạn sẽ kết thúc bằng cách sử dụng currying, nhưng khi sử dụng mũi tên, bạn sẽ sử dụng thông số bổ sung và đầu ra loop cung cấp cho bạn.

Về cơ bản, loop liên kết một nút, cho phép mũi tên truy cập vào đầu ra phụ của chính nó, giống như fix liên kết một nút, cho phép truy cập chức năng vào đầu ra của chính nó làm đầu vào.

6

"Tìm kiếm điểm cố định" là chính xác điều này thực hiện điều gì. Đây là sự lười biếng của Haskell trong hành động. Xem thêm tại Wikipedia.

Các vấn đề liên quan