Trong Haskell, một số danh sách là cyclic:Khả năng phát hiện danh sách tuần hoàn trong Haskell có phá vỡ bất kỳ thuộc tính nào của ngôn ngữ không?
ones = 1 : ones
Những người khác không:
nums = [1..]
Và sau đó có những điều như thế này:
more_ones = f 1 where f x = x : f x
này biểu thị giá trị tương tự như ones
và chắc chắn giá trị đó là một chuỗi lặp lại. Nhưng cho dù nó được thể hiện trong bộ nhớ như là một cấu trúc dữ liệu tuần hoàn là nghi ngờ. (An thực hiện có thể làm như vậy, nhưng this answer explains that "it's unlikely that this will happen in practice".)
Giả sử chúng ta hãy thực hiện Haskell và hack vào nó một built-in chức năng isCycle :: [a] -> Bool
để quan sát cấu trúc của đại diện trong bộ nhớ của đối số. Nó trả về True
nếu danh sách là theo chu kỳ vật lý và False
nếu đối số có độ dài hữu hạn. Nếu không, nó sẽ không chấm dứt. (Tôi tưởng tượng "hack nó trong" vì nó không thể viết chức năng đó trong Haskell.)
Sự tồn tại của chức năng này có phá vỡ bất kỳ thuộc tính thú vị nào của ngôn ngữ không?
Vâng, bạn đột nhiên có thể trả về các giá trị khác nhau cho cùng một yếu tố đầu vào: 'f x = if isCycle x rồi 1 else 2'. Điều này sẽ trả về '1' hoặc' 2' cho giá trị 'số' phụ thuộc vào cách bạn xây dựng cùng một danh sách đó. Điều này có vẻ là một sự phá vỡ khá lớn khi xem xét một trong những ưu điểm rõ ràng nhất của các ngôn ngữ chức năng là một hàm sẽ luôn trả về cùng một kết quả nếu được đưa ra cùng một giá trị trong ... – Bakuriu
Điều này chỉ được coi là chấp nhận được khi bị ràng buộc với 'IO' . Bạn có thể viết 'isCycle :: [a] -> IO Bool' dưới dạng cấu trúc rõ ràng của biểu đồ của danh sách thu được từ [dữ liệu-reify] (https://hackage.haskell.org/package/data-reify) sử dụng nội bộ ['StableName's] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/System-Mem-StableName.html#t:StableName). Nếu bạn nhìn quá khó vào bộ nhớ với 'IO' bạn có thể làm những điều hoàn toàn độc ác, như [phá vỡ độ tinh khiết của các hàm thuần túy mà không phải dùng đến bất cứ thứ gì 'không an toàn'] (http://stackoverflow.com/a/28701687/414413). – Cirdec
Kiểm tra xem danh sách có phải là vòng tuần hoàn vật lý hay không sẽ yêu cầu kiểm tra tất cả các nút cho đến khi tìm thấy chu trình. Điều này sẽ không chấm dứt trên danh sách vô hạn trong Haskell. Tuy nhiên nó sẽ trong Lisp (và có lẽ tất cả các ngôn ngữ mệnh lệnh), bởi vì danh sách vòng tuần hoàn là cách duy nhất để thực hiện danh sách vô hạn. – mb14