Ciężko mi zrozumieć typy Higher Kind vs Higher Rank. Rodzaj jest dość prosty (dzięki temu, że Haskell do tego pisze) i myślałem, że ranga jest jak rodzaj, gdy mówimy o typach, ale najwyraźniej nie! Przeczytałem artykuł z Wikipedii bezskutecznie. Czy ktoś może wyjaśnić, czym jest ranga? i co oznacza wyższa ranga? Polimorfizm wyższej rangi? jak to przychodzi do Rodzin (jeśli w ogóle)? Porównanie Scali z Haskellem też byłoby niesamowite.Kind vs Rank in type theory
Odpowiedz
Pojęcie rangi nie jest tak naprawdę związane z pojęciem rodzaju.
Ranga systemu typu polimorficznego opisuje, gdzie mogą pojawiać się typy forall
. W systemie o typie rank-1 mogą pojawiać się tylko na najbardziej zewnętrznym poziomie, w systemie typu rank-2 mogą pojawiać się na jednym poziomie zagnieżdżania i tak dalej.
Na przykład forall a. Show a => (a -> String) -> a -> String
byłby typem rank-1, a forall a. Show a => (forall b. Show b => b -> String) -> a -> String
byłby typem rank-2. Różnica między tymi dwoma typami polega na tym, że pierwszym argumentem funkcji może być dowolna funkcja pobierająca jeden argument i zwracająca łańcuch. Tak więc funkcja typu Int -> String
byłaby poprawnym pierwszym argumentem (podobnie jak hipotetyczna funkcja intToString
), tak samo jak funkcja typu forall a. Show a => a -> String
(jak show
). W drugim przypadku tylko funkcja typu forall a. Show a => a -> String
byłaby prawidłowym argumentem, tj. show
byłaby w porządku, ale nie byłaby to intToString
. W konsekwencji następująca funkcja byłaby funkcja prawną drugiego typu, ale nie pierwszy (gdzie ++
ma reprezentować konkatenacji String):
higherRankedFunction(f, x) = f("hello") ++ f(x) ++ f(42)
Zauważ, że tutaj funkcja f
nakłada się (potencjalnie) trzy różne typy argumentów. Więc jeśli f
byłaby funkcją intToString
, to by nie działało.
Zarówno Haskell, jak i Scala są Rangami 1 (więc powyższa funkcja nie może być zapisana w tych językach) domyślnie. Ale GHC zawiera rozszerzenie językowe, aby umożliwić polimorfizm Rank-2, a inne, aby umożliwić polimorfizm Rank-n dla arbitralnego n.
- 1. Co to jest typowy nadtyp wszystkich instancji Kind in Type Theory
- 2. Kind Demotion (w przeciwieństwie do promocji Kind)
- 3. Python Type System - Object vs Type
- 4. Kind podpisy i typ rodziny
- 5. Page Rank w Pythonie
- 6. Prośba o rodzaju danej Type w Scala vs Haskell
- 7. DateTime Porównaj Ignores Kind?
- 8. Pandy CIĘŻKIEJ RANK
- 9. MySQL Rank with ties
- 10. SQL JOIN vs IN performance?
- 11. http.createserver vs net.createserver in node.js
- 12. Subclassing vs Extension in swift
- 13. ArrayBuffer vs ArrayBuilder in scala
- 14. Particles vs ParticleSystem in three.js
- 15. „<>” vs „NOT IN”
- 16. Union Vs Concat in Linq
- 17. virtuale vs Methods in Mongoose
- 18. ++ someVariable Vs. someVariable ++ in JavaScript
- 19. Int vs Integer in Swift
- 20. Programowe definiowanie klasy: type vs types.new_class
- 21. Mysql Exists vs IN - skorelowane podzapytanie vs podzapytanie?
- 22. Wymagania wstępne do zrozumienia Wavelet theory
- 23. Scope vs Class Method in Rails 3
- 24. implements vs extends in generics w Javie
- 25. html.haml vs haml in Rails zobacz szablony
- 26. distincto vs. fd/distinct in core.logic
- 27. Wyrażenia sql z equals vs in
- 28. IN vs OR Oracle, który szybciej?
- 29. Realm VS Room in Android app
- 30. Struct vs test double in ruby
czy nie możemy powiedzieć, że rangi kwalifikują zmienne typu, podczas gdy rodzaje kwalifikują stałe typu? – didierc
@didierc Nie jestem do końca pewien, co masz na myśli, ale nie sądzę. Zarówno zmienne typu, jak i stałe typu mają rodzaje. – sepp2k
Możesz łatwo kodować wyższe typy w scali. Zobacz http://www.cs.ox.ac.uk/jeremy.gibbons/publications/scalagp.pdf, rozdział 7.2. –