Thuật ngữ thích hợp cho hàm nghịch đảo với hàm tạo - để mở ra một giá trị từ một kiểu dữ liệu?


13

Chỉnh sửa: Tôi đang đọc lại câu hỏi một chút. Rõ ràng tôi đã gây ra một số nhầm lẫn vì tôi đã không nhận ra rằng thuật ngữ hủy diệt được sử dụng trong OOP cho một thứ khá khác biệt - đó là một chức năng được gọi khi một đối tượng đang bị phá hủy. Trong lập trình chức năng, chúng tôi (cố gắng) tránh trạng thái có thể thay đổi để không có trạng thái tương đương với nó. (Tôi đã thêm thẻ thích hợp vào câu hỏi.)

Thay vào đó, tôi đã thấy rằng trường bản ghi để hủy ghép một giá trị (đặc biệt đối với các loại dữ liệu có giá trị đơn lẻ như newtypes) đôi khi được gọi là hàm hủy hoặc có thể là bộ giải mã . Ví dụ: hãy có (trong Haskell):

newtype Wrap = Wrap { unwrap :: Int }

Đây Wraplà constructor và unwraplà gì?

Các câu hỏi là:

  • Làm thế nào để chúng ta gọi unwraptrong lập trình chức năng? Giải cấu trúc? Kẻ hủy diệt? Hoặc bởi một số thuật ngữ khác?
  • Và để làm rõ, thuật ngữ này / thuật ngữ khác có thể áp dụng cho các ngôn ngữ chức năng khác hay chỉ được sử dụng trong Haskell?
  • Có lẽ cũng vậy, có thuật ngữ nào cho việc này nói chung, trong các ngôn ngữ phi chức năng không?

Tôi đã thấy cả hai thuật ngữ, ví dụ:

... Thông thường, một người cung cấp các nhà xây dựng và phá hủy thông minh cho những người này để dễ dàng làm việc với họ. ...

tại wiki Haskell , hoặc

... Chủ đề chung ở đây là hợp nhất các hàm tạo - cặp giải mã như ...

tại Haskell wikibook (ở đây có lẽ có nghĩa chung hơn một chút), hoặc

newtype DList a = DL { unDL :: [a] -> [a] }

Hàm unDL là bộ giải mã của chúng ta , loại bỏ hàm tạo DL. ...

trong thế giới thực Haskell .


3
Destructor dường như là thuật ngữ được sử dụng rộng rãi nhất
Zavior

3
Điều này có vẻ đặc biệt đối với Haskell (một "kẻ hủy diệt" trong Haskell không phải là khái niệm giống như trong C ++. Sự giống nhau về tên là sai lệch). Nếu bạn muốn khái niệm chung về "mở khóa một giá trị", có lẽ bạn không nên sử dụng Haskell làm ví dụ. Trong C ++ - giống như các ngôn ngữ, một "trình mở khóa" như vậy có thể chỉ đơn giản là một getter!
Andres F.

1
Tôi đề nghị bạn xóa từ "hàm hủy" khỏi câu hỏi, thay vào đó, hãy sử dụng "trình hủy bỏ" và hỏi liệu có một tên chung cho mẫu này trên các ngôn ngữ không :)
Andres F.

1
.unapply, hoặc "trình trích xuất" là một dạng tương tự thô trong scala, nhưng có thể không có tên vì trong hầu hết các trường hợp, bạn chỉ đơn giản là khớp mẫu
Gene T

Câu trả lời:


5

Có một số thuật ngữ cho khái niệm này. Giải cấu trúc là những gì tôi tin là phổ biến trong các vòng tròn Haskell, đó là những gì Real World Haskell gọi nó. Tôi tin rằng thuật ngữ phá hủy (hoặc phá hủy liên kết) là phổ biến trong các vòng tròn Lisp.


1
Thú vị như thế nào điều tương tự được một thuật ngữ khác nhau từ một ngôn ngữ này sang thế, giống như lượt bản đồ vào chọn trong C #, Haskell có lần lisp / java đã giảm và ruby có bơm, Haskell có scala ràng buộc có flatMap C # có SelectMany
Jimmy Hoffa

Nó thực sự được gọi là giải cấu trúc trong vòng tròn Haskell. Nếu nó nghe có vẻ kỳ quặc, hãy nhớ rằng Haskell không có đối tượng - chỉ là các giá trị; Vì vậy, không cần phải nói rằng thuật ngữ này có một ý nghĩa khác. Phần lớn là "giải cấu trúc" chính xác là những gì nó làm. Về lưu ý đó, cá nhân tôi nghĩ rằng các bộ giải mã đối tượng nên được gọi là một cái gì đó dọc theo dòng của các bộ xử lý đối tượng. Nó là nhiều, chính xác hơn nhiều.
MasterMastic

8

Destructor là thuật ngữ được sử dụng bởi C ++ và có thể các ngôn ngữ khác mà tôi không biết. Chúng được sử dụng để giải phóng các nguồn tài nguyên được tạo bởi nhà xây dựng để họ làm ngược lại chính xác với nó. Có thể khái niệm này không dịch theo nghĩa đen sang Haskell, nhưng thuật ngữ này dường như được sử dụng ở một số nơi.

EDIT: Xem xét chỉnh sửa của bạn cho câu hỏi, tôi sẽ gọi nó là một trình gỡ bỏ sau đó ... Tôi đã có thể trả lời câu hỏi ban đầu nhưng bây giờ nó đã tránh xa kiến ​​thức của tôi vì vậy đừng quá coi trọng chỉnh sửa này.


1
Lưu ý rằng việc sử dụng thuật ngữ "hàm hủy" của C ++ / C # / Java không khớp với Haskell. Cùng một từ, các khái niệm khác nhau.
Andres F.

1
@AresresF. Vâng, đó là lý do tại sao tôi thêm câu:Maybe in Haskell this does not translate really well but I don't know the language.
marco-fiset

1
Đủ công bằng, tôi loại bỏ downvote của tôi. Tôi nghĩ những gì sai lầm là câu hỏi thực tế, dường như đang hỏi một điều, nhưng thực sự là hỏi một điều khác! :)
Andres F.

@AresresF. Có câu hỏi là sai lệch. OP hỏi : What's the proper term for a function inverse to a constructor?. Trừ khi câu hỏi được chỉnh sửa để cụ thể hơn đối với một số khái niệm Haskell, tôi sẽ để lại câu trả lời của mình.
marco-fiset

1
Chỉ cần một lưu ý, C # có bộ hoàn thiện nhưng không có hàm hủy, điều này khác nhau bởi vì bộ hoàn thiện có thực thi không xác định. Vì vậy, có thể chỉnh sửa câu trả lời của bạn để không lan truyền sai từ các hàm hủy trong C #.
Jimmy Hoffa

6

Trong OOP, hàm tạo là một cấu trúc chức năng hoặc ngôn ngữ tạo và khởi tạo một đối tượng mới ('xây dựng' đối tượng) và hàm hủy là đối tượng kép của nó, một chức năng hoặc ngôn ngữ sẽ dọn sạch sau đối tượng (bằng cách giải phóng bất kỳ tài nguyên nào giữ) và xóa nó.

Tuy nhiên, vì Haskell (không giống như C ++) có bộ sưu tập rác và không hỗ trợ trạng thái có thể thay đổi hoặc các tác dụng phụ khác (ít nhất là không trực tiếp), nên hoàn toàn không có lý do nào cho khái niệm hủy diệt theo nghĩa OOP. Ngoài ra, các hàm tạo Haskell, không giống như các hàm tạo OOP, có nhiều ứng dụng hơn là chỉ tạo đối tượng; chúng cũng được sử dụng nhiều trong so khớp mẫu (xem ví dụ dưới đây).

Trong ví dụ mã của bạn, 'Unwrap' là một lĩnh vực thu âm , và tùy thuộc vào cách nó được sử dụng, tôi có thể coi nó như một accessor , hoặc thậm chí có một getter (mặc dù sau này cũng được sử dụng trong một bối cảnh ống kính, vì vậy nó có thể thực sự là một chút khó hiểu).

Tôi chưa bao giờ nghe thấy thuật ngữ 'kẻ hủy diệt' (hay 'người giải mã') được sử dụng trong bối cảnh Haskell; như Andres F. lưu ý, tuy nhiên, đôi khi nó được sử dụng để chỉ một hàm hoàn tác gói được giới thiệu bởi một nhà xây dựng. Theo hiểu biết của tôi, một trình thu thập bản ghi có thể đóng vai trò là hàm hủy, nhưng các hàm thông thường cũng vậy, miễn là chúng lấy lại giá trị từ một loại dữ liệu phức tạp hơn. Ví dụ bao gồm maybeeithertừ khúc dạo đầu.

Lưu ý rằng unwrap, trong ví dụ của bạn, có thể có một số điều:

  • một chức năng (giống như bất kỳ chức năng nào khác): ví dụ, bạn có thể làm map unwrap [ Wrap 23, Wrap 42 ]; việc sử dụng này gần tương đương với một phương thức getter trong OOP.
  • một công cụ xác định trường bản ghi trong một bản ghi xây dựng: let w = Wrap { unwrap = 23 }
  • một công cụ xác định trường bản ghi trong bản cập nhật bản ghi : let w' = w { unwrap = 23 }; điều này tương tự với các phương thức setter trong OOP (nếu bạn ép nhiều).
  • một công cụ xác định trường bản ghi trong khớp mẫu: f Wrap { unwrap = a } = a

Có lẽ tốt nhất để nghĩ về các nhà xây dựng Haskell là một cái gì đó khác hoàn toàn với các nhà xây dựng OOP. Tôi đề nghị bạn (đọc lại) một cuốn sách hay về ngôn ngữ lập trình Haskell để hiểu rõ hơn - "Real World Haskell" thực sự hay và tôi đã nghe những điều hay về "Learn You A Haskell" . Cả hai nên có giải thích tốt về các nhà xây dựng và ghi cú pháp cụ thể.


2
Bằng chứng về việc sử dụng thuật ngữ "kẻ hủy diệt" trong cộng đồng Haskell: haskell.org/pipermail/beginners/2010-April/003946.htmlmail-archive.com/haskell-cafe@haskell.org/msg26463.html . Một "kẻ hủy diệt" trong biệt ngữ Haskell là một "trình hủy bỏ", một khái niệm hoàn toàn không liên quan đến quản lý bộ nhớ hoặc hoàn thiện đối tượng.
Andres F.

3
Giám đốc luận án của tôi, người lập trình độc quyền tại Haskell, cũng sử dụng thuật ngữ "kẻ hủy diệt" cho một trình mở rộng.
Andres F.

Vâng, tôi chưa bao giờ đi qua các thuật ngữ. Bạn hoàn toàn đúng rằng, khi được sử dụng, nó hoàn toàn không liên quan gì đến khái niệm hàm hủy trong OOP.
tdammers

@AndresF.: Đã chỉnh sửa để tôn vinh nhận xét của bạn.
tdammers

@AresresF. Điều này thật thú vị vì tôi cũng chưa bao giờ nghe thấy nó được gọi là một hàm hủy, mặc dù vậy, nó sẽ không chính xác nếu chỉ coi nó như một trường bản ghi, và kỹ thuật mà tôi thấy gọi là "hàm hủy" ở đó chỉ là một mẫu khớp ? Tôi hiểu nó được gọi là "phá hủy" khi trận đấu của bạn tách một danh sách ra, đây có phải là một thuật ngữ liên quan nhưng có liên quan đến một ADT không? Sau khi tất cả phá hủy một danh sách chỉ hoạt động trên một ADT vì đó là danh sách đó .. Tôi đã nhận được thuật ngữ hủy từ stackoverflow.com/questions/11677806/ Lỗi
Jimmy Hoffa

2

Tôi nghĩ rằng kẻ hủy diệt là thuật ngữ rộng hơn. Một số ngôn ngữ như Java và VB.NET có bộ hoàn thiện. /programming/171952/is-there-a-destructor-for-java


Một hàm hủy trong C ++ - giống như các ngôn ngữ thực hiện các hành động dọn dẹp trước khi giải phóng bộ nhớ được phân bổ. Một hàm hủy trong Haskell mở ra một giá trị từ "lớp ngoài" của nó (bạn không sử dụng nó để dọn dẹp bất cứ thứ gì). Chúng không phải là những khái niệm thực sự liên quan.
Andres F.

2
Tôi đoán tôi đã không nhận ra đây là một câu hỏi Haskel.
JeffO

Thật sự không rõ ràng. Câu hỏi hiện đã được kiểm tra lại và điều chỉnh lại :)
Andres F.

2

Vì dường như không có bất kỳ quy ước ngôn ngữ chéo nào, tôi thường gọi chúng là các trình trích xuất , bởi vì đó là thuật ngữ mà Scala sử dụng cho khái niệm chung đó và bởi vì nó không có khả năng bị nhầm lẫn với bất kỳ cách sử dụng hiện có nào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.