Điều này hơi khó hiểu, nhưng tính toán xuất hiện trong các loại dữ liệu đại số. Đối với bất kỳ loại đã cho, loại bối cảnh một lỗ của nó là đạo hàm của loại đó. Xem bài nói chuyện tuyệt vời này để biết tổng quan về toàn bộ chủ đề. Đây là thuật ngữ rất kỹ thuật, vì vậy hãy giải thích.
Các kiểu dữ liệu đại số
Bạn có thể đã bắt gặp các bộ dữ liệu được gọi là các loại sản phẩm (nếu không, đó là vì chúng là sản phẩm của cartesian gồm hai loại). Chúng tôi sẽ thực hiện điều này theo nghĩa đen và sử dụng ký hiệu:
a ∗ b
Để biểu thị một tuple, trong đó và b là cả hai loại. Tiếp theo, bạn có thể bắt gặp các loại tổng, đây là các loại có thể là một loại hoặc loại khác (được gọi là công đoàn , biến thể hoặc là loại Hoặc (loại) trong Haskell). Chúng tôi cũng sẽ lấy cái này theo nghĩa đen và sử dụng ký hiệu:mộtb
a + b
Đây là những tên như vậy vì nếu một loại có N một giá trị và một loại b có N b giá trị, sau đó loại một + b có N một + N b giá trị.mộtVIẾT SAI RỒImộtbVIẾT SAI RỒIba + bVIẾT SAI RỒImột+ Nb
Các loại này trông giống như các biểu thức đại số bình thường và trên thực tế, chúng ta có thể điều khiển chúng như vậy (đến một điểm).
Một ví dụ
Trong các ngôn ngữ chức năng, định nghĩa chung của một danh sách (được nêu trong Haskell ở đây) là:
data List a = Empty
| Cons a List
Điều này nói rằng một danh sách trống hoặc một bộ giá trị và một danh sách khác. Chuyển đổi nó thành ký hiệu đại số, chúng ta nhận được:
L ( a ) = 1 + a ∗ L ( a )
Trong đó đại diện cho một loại với một giá trị (còn gọi là loại đơn vị). Bằng cách chèn nhiều lần, chúng ta có thể đánh giá điều này để có được định nghĩa cho L ( a ) :1L ( a )
L ( a ) = 1 + a ∗ L ( a )
L ( a ) = 1 + a ∗ ( 1 + a ∗ L ( a ) )
L ( a ) = 1 + a + a2* ( 1 + một * L ( một ) )
L ( a ) = 1 + a + a2+ một3* ( 1 + một * L ( một ) )
L ( a ) = 1 + a + a2+ một3+ một4+ một5. . .
xviết sai rồi
Định nghĩa này nói rằng một danh sách là một đơn vị, hoặc một bộ của một mục, hoặc một bộ gồm hai mục, hoặc ba, v.v., đó là định nghĩa của một danh sách!
Bối cảnh một lỗ
Bây giờ với bối cảnh một lỗ: bối cảnh một lỗ là những gì bạn nhận được khi bạn 'lấy giá trị' của một loại sản phẩm. Hãy cho một ví dụ:
một2mộta + a2 a
Lấy một giá trị trong 3-tuple cho 2-tuple, nhưng có ba biến thể khác nhau:
( a , a , _ )
( a , _ , a )
( _ , a , a )
3 a2một3
Ví dụ cuối cùng của chúng tôi, hãy sử dụng một danh sách:
Nếu chúng tôi lấy biểu thức ban đầu của chúng tôi cho một danh sách:
L ( a ) = 1 + a ∗ L ( a )
Chúng tôi có thể sắp xếp lại để có được:
L ( a ) = 11 - một
(Nhìn bề ngoài, điều này có vẻ như vô nghĩa, nhưng nếu bạn lấy chuỗi taylor của kết quả này, bạn sẽ có được định nghĩa mà chúng tôi đã đưa ra trước đó.)
Bây giờ nếu chúng ta phân biệt điều này, chúng ta sẽ nhận được một kết quả thú vị:
∂L ( a )∂một= ( L ( a ) )2
Do đó, một danh sách đã trở thành một cặp danh sách. Điều này trong thực tế có ý nghĩa: hai danh sách được tạo ra tương ứng với các yếu tố trên và dưới lỗ hổng trong danh sách ban đầu!