Beberapa karya Conor McBride, Diff , Dissect , mengaitkan turunan tipe data dengan "tipe konteks satu lubang" mereka. Yaitu, jika Anda mengambil turunan dari tipe Anda dibiarkan dengan tipe data yang menunjukkan kepada Anda bagaimana tipe data terlihat dari dalam pada titik tertentu.
Jadi, misalnya, jika Anda memiliki daftar (di Haskell)
data List a = [] | a : List a
ini sesuai dengan
data List a = 1 + a * List a
dan melalui sedikit keajaiban matematika, turunannya adalah
data ListDeriv a = List a * List a
yang diartikan sebagai bahwa pada setiap titik dalam daftar akan ada daftar di sebelah kiri dan daftar di sebelah kanan. Kami dapat zip melalui daftar asli dengan menggunakan struktur data turunan.
Sekarang, saya tertarik melakukan sesuatu yang mirip dengan grafik. Representasi umum dari grafik adalah seperangkat simpul dan tepi, yang mungkin secara naif diimplementasikan dengan tipe data seperti:
data Gr a b i = Gr [(i,a)] [(i,i,b)]
Jika saya memahaminya dengan benar, turunan dari tipe data ini, sehubungan dengan indeks grafik i
,, harus berupa sesuatu.
data GrDeriv a b i = d/di (Gr a b i)
= d\di ( [a*i] * [b*i^2] )
= (d\di [a*i]) * [b*i^2] ) + [a*i]*(d/di [b*i^2])
= (a* [a*i] * [a*i]) * [b*i^2] )
+ [a*i] * (2*b*i) *[b*i^2]*[b*i^2])
= InNodes { nodesLeft :: [(a,i)]
, nodeLbl :: a
, nodesRight :: [(a,i)]
, edges :: [(b,i,i)] }
| InEdges { nodes :: [(a,i)]
, adjNode :: Either (b,i) (b,i)
, edgesLeft :: [(b,i,i)]
, edgesRight :: [(b,i,i)] }
Saya mendapatkan ini melalui penggunaan aturan produk dan aturan rantai untuk turunan, dan meskipun mungkin ada beberapa kesalahan, tampaknya mengikuti skema umum. Dalam struktur ini Anda akan fokus pada Nodes (InNodes constructor) atau Edges (In edge) dan diberikan tempat Anda akan melihat data yang relevan.
Tapi ini bukan yang kuharapkan. Saya berharap untuk membangun lebih dekat terkait dengan antarmuka Perpustakaan Grafik Fungsional Martin Erwigs. Secara khusus, saya ingin melihat pada sebuah konteks konteks yang mewakili label node dan dua daftar adjacency, satu untuk keluar, satu untuk masuk.
Node a b = ([(i,b)],a,[(i,b)])
Saya memang melihat harapan, bagaimanapun, karena perwakilan adjacency memiliki beberapa istilah yang sama dengan turunan, label tunggal a
,, di setiap lokasi lubang, perwakilan adjacency / pembedahan setiap sisi.
Karena turunan bukan fungsi yang sama dengan aslinya, tetapi integrasi turunan adalah (kindof), apakah ada semacam analog integrasi yang akan berfungsi untuk mengubah turunan menjadi kumpulan konteks simpul? Bukan integrasi langsung untuk memulihkan struktur asli, ingatlah, tetapi struktur yang setara dengan yang asli tetapi dalam representasi yang lebih ramah algoritma.
Jika ada, saya berharap bahwa struktur tipe hubungan dapat ditentukan oleh beberapa bahasa "set simpul dan tepi" yang mudah dan saya dapat memperoleh perpustakaan yang efisien untuk bekerja dengan struktur itu. Penerapan seperti itu dapat digunakan untuk mempelajari struktur "di luar teori grafik": grafik hiper, kompleks sederhana ...
Begitu. Apakah ide ini tampak layak? Berguna? Apakah ada studi tentang hal semacam ini yang bisa saya baca lebih lanjut?
Tambahan
Seperti yang dikomentari oleh Curtis F , satu set node dan edge bukan grafik. Namun, semua grafik dapat direpresentasikan dengan demikian, dan menurut saya presentasi itu cukup umum. Saya telah melihat (spesifikasi sangat kasar) digunakan dalam penelitian yang menerapkan teori grafik untuk optimalisasi jaringan nirkabel dalam berbagai cara. Ini contoh akses terbuka, DRAND *. Hal ini menimbulkan pertanyaan, apa hubungan antara presentasi dan bagaimana beberapa perangkat lunak dapat diimplementasikan berdasarkan penelitian.
Yang mengatakan, saya tidak sepenuhnya menentang mengubah spec input dari ke sesuatu yang lain. Misalnya, diberi indeks tipe I , label simpul, V , dan label tepi, E . Kemudian grafiknya adalah (kurang-lebih) fungsi dari indeks ke label dan daftar tepi.
Ini, saya cukup yakin dapat dinyatakan (Kategori teori?) Sebagai
atau
Saya pikir itu menunjukkan beberapa janji, tetapi saya tidak memiliki kecanggihan untuk melangkah lebih jauh. Saya tahu pasti ada beberapa pekerjaan di luar sana yang mengeksplorasi koneksi lebih lanjut.
* Jika tautannya terputus, kutipan: Rhee, Injong, et al. "DRAND: Penjadwalan TDMA acak yang didistribusikan untuk jaringan ad hoc nirkabel." Transaksi IEEE pada Mobile Computing 8.10 (2009): 1384-1396.