Nếu tôi có một loại giống như data T = T Int String
và một chức năng như vậy:GHC có tạo một bản sao mới của một đối tượng khi phá hủy và xây dựng lại nó không?
identity :: T -> T
identity (T a b) = T a b
Sau khi giải cấu trúc trong mô hình kết hợp, không GHC tạo ra một đối tượng T mới có chứa tham chiếu đến cùng Int và String? Hay nó trả về cùng một đối tượng chính xác (với cùng một địa chỉ bộ nhớ) mà nó nhận được? Tôi hiểu chúng tương đương về mặt ngữ nghĩa, tôi chỉ tò mò thôi.
Tôi hiểu. Đó là loại thất vọng. Tôi đã thực sự suy nghĩ về trường hợp bạn có một cấu trúc dữ liệu liên tục lồng nhau (như một cây nhị phân) và bạn muốn chèn một giá trị đã có sẵn. Bạn sẽ cần một hàm trợ giúp như 'insert :: (Ord a) => a -> Tree a -> Có thể (Tree a) 'trả về giá trị Không có gì nếu phần tử đã có mặt để tránh tái tạo đường dẫn của giá trị . –
@Ramith Điều đó phá hủy sự lười biếng không may; tất cả các cuộc gọi trên đường dẫn đến nút lá sẽ phải chờ cuộc gọi cuối cùng quay trở lại trước khi họ biết liệu họ có trả về một tham chiếu đến nút xây dựng hiện có hay phân bổ một nút mới, có nghĩa là buộc gốc bước buộc mọi thứ. Vì vậy, nếu bạn muốn lựa chọn giữa các thuộc tính đó (sự lười biếng và tránh tái tạo cây giống hệt nhau), thì nó cần phải được lập trình rõ ràng (chẳng hạn như thông qua trình trợ giúp Có thể (Tree a)) hơn là hành vi ngầm của trình biên dịch. – Ben
Có phải 'unsafeCoerce' an toàn trong trường hợp này không? Tôi có nghĩa là 'Hoặc là một' và 'hoặc là một c' có cùng một đối số để' trái' vì vậy nó có vẻ hợp lý rằng các 'trái' constructor có thể được ép buộc mà không có vấn đề (và có lẽ là), tuy nhiên là có * bảo đảm * về điều này? – Bakuriu