Bağımlı Türlere Örnek?

Sep 14 2020

Diyelim MemoryStoreki, bir dizi MemorySlabCachenesneye sahip olan ve her MemorySlabCachebiri bir dizi MemorySlabnesneye sahip olan 3 nesneniz var. Bunun gibi bir çeşit:

class MemoryStore {
  caches: Array<MemorySlabCache> = []
}

class MemorySlabCache {
  size: Integer
  slabs: Array<MemorySlab> = []
}

class MemorySlab {
  
}

Ama mesele şu ki, bu her şeyi yakalamıyor. Ayrıca MemorySlabCache, MemorySlabnesnelerin hangi büyüklükte olduğunu söylemek için kullanılan her birinin bir boyuta sahip olduğu gerçeğini yakalaması gerekir . Yani daha çok şöyle:

class MemoryStore {
  caches: Array<MemorySlabCache> = []
}

class MemorySlabCache {
  size: Integer
  slabs: Array<MemorySlab<size>> = []
}

class MemorySlab<size: Integer> {
  
}

Sonra önbelleklerimizi oluşturuyoruz:

let 4bytes = new MemorySlabCache(size: 4)
let 8bytes = new MemorySlabCache(size: 8)
...
let 32bytes = new MemorySlabCache(size: 32)
...
store.caches.push(4bytes, 8bytes, ..., 32bytes, ...)

Bu, " bağımlı tür ", "tanımı bir değere bağlı bir tür " olarak sayılır mı ? Türü, Array<MemorySlab<size>>üzerindeki sizealana atanan değere bağlı olduğundan MemorySlabCache. Değilse, bu nedir? Onu bağımlı tiplerin bir örneği haline getiren nedir?

Yanıtlar

4 DanDoel Sep 15 2020 at 00:59

Yani cevap muhtemelen "evet", bu bağımlı tiplere bir örnek. Ancak, insanların bunun için yarattığı birçok basit örnekle ilgili sorun, bağımlı yazmanın önemsiz olmayan yönlerini göstermemeleridir.

Muhtemelen sizinki bu açıdan daha iyidir, çünkü söz konusu tür, 'deki keyfi bir değere bağlıdır MemorySlabCache. Ancak, MemorySlabCachestatik olarak bilinen bir değeri asla kullanmazsınız . Yani daha ilginç bir örnek şöyle olacaktır:

let cacheSize = readInteger(stdin)
store.caches.push(new MemorySlabCache(cacheSize))

Bu nedenle, kullanıcının çalışma zamanında bir önbellek boyutu seçmesine izin verirsiniz, ancak önbellek boyutu türe kaydedilir ve tür denetleyicisi, boyut statik olarak bilinmese bile tüm işlemlerin boyut açısından anlamlı olmasını statik olarak sağlar. (Bu, örneğinizle ilgili başka bir sorundur; içindeki hiçbir şey, izlenen boyutun daha sonra nasıl önemli olduğunu göstermez).

Biraz daha küçük bir sorun, tam sayıların bağımlı türleri 'taklit etmek' için çok kolay bir yapı olmasıdır, bu nedenle onlarla ilgili örnekler, gerçek bağımlı türlerle mümkün olabilecekleri satmanın altında kalmaktadır. Örneğin, bazı uzantılara sahip Haskell, gerçekten bağımlı türlere sahip olmasa bile, çalışma zamanı önbellek boyutu örneğime benzer bir şeyi bile kodlayabilir. Statik olarak bilinen tür düzeyinde tam sayılarınız olabilir ve çalışma zamanı tamsayısına dayalı olarak statik olarak yazılan bir değer için uygun bir değeri geri veren bir işlev oluşturabilirsiniz. Bununla birlikte, bağımlı tür teorisine dayanan diller genellikle türlerin işlev türleri gibi keyfi türlerin değerlerine bağlı olmasına izin verir. Bunlar (ve diğer ilgili özellikler) için 'numara yapmak' gerçekten mümkün değildir.