Niestety, nie mogłem sobie wyobrazić lepszego tytułu do tego pytania, więc proszę czytać dalej. Wyobraźmy sobie, że mamy zamkniętą rodzinę typ, który mapuje każdy rodzaj nim koresponduje Maybe
wyjątkiem maybes się:Rodzaje zamkniętych rodzin i dziwne typy funkcji
type family Family x where
Family (Maybe x) = Maybe x
Family x = Maybe x
Możemy nawet zadeklarować funkcji przy użyciu tego typu family:
doMagic :: a -> Family a
doMagic = undefined
exampleA = doMagic $ Just()
exampleB = doMagic $()
grać z nim w GHCi pokazuje, że można ocenić rodzaj tej funkcji:
*Strange> :t exampleA
exampleA :: Maybe()
*Strange> :t exampleB
exampleB :: Maybe()
Pytanie brzmi, czy możliwe jest dostarczenie jakichkolwiek implementati funkcji doMagic
z wyjątkiem undefined
? Powiedzmy na przykład, że chciałbym zawrzeć każdą wartość w konstruktorze Just
, oprócz Maybesa, który powinien pozostać nienaruszony, jak mógłbym to zrobić? Próbowałem używać typeclasses, ale nie udało mi się napisać kompilowanego podpisu dla funkcji doMagic, jeśli nie korzystałem z rodzin o zamkniętym typie, czy ktoś mógłby mi pomóc?
W dynamicznie wpisywanym języku 'doMagic x = Just undefined' będzie również respektować typy. Teoretycznie rzecz biorąc, system typów mógłby na to pozwolić (ale czy byłoby to naprawdę przydatne?). BTW, opisywany przez ciebie przykład, jeśli robisz różne rzeczy, w zależności od tego, który konkretny typ to "a", wymagałby informacji o typie w czasie wykonywania, podczas gdy Haskell został zaprojektowany, aby umożliwić wymazywanie typu (brak informacji o typie w czasie wykonywania). Można jednak uzyskać coś bliskiego, używając klasy typów. – chi
Co więcej, pytanie wygląda na związane z "czym jest wolne twierdzenie typu w obecności zamkniętych rodzin rodzin?". – chi