Wdrażam system rodzajowy dla nowego języka programowania funkcjonalnego i obecnie piszę funkcję unifikacji dwóch rodzajów. Istnieją cztery przypadki dwóch rozważenia:Czy można uzyskać nieskończony błąd rodzaju w Haskell 98?
+---------+---------+-------------------------------------------------------+
| k1 | k2 | action |
+=========+=========+=======================================================+
| var | var | k1 := k2^k2 := k1 |
+---------+---------+-------------------------------------------------------+
| var | non var | if (!occurs(k1, k2)) k1 := k2 |
+---------+---------+-------------------------------------------------------+
| non var | var | if (!occurs(k2, k1)) k2 := k1 |
+---------+---------+-------------------------------------------------------+
| non var | non var | ensure same name and arity, and unify respective args |
+---------+---------+-------------------------------------------------------+
- Kiedy zarówno
k1
ik2
są zmiennymi następnie są one tworzone wystąpienia do siebie. - Gdy tylko
k1
jest zmienną, jest tworzony jakok2
iffk1
nie występuje wk2
. - Gdy zmienna ma tylko
k2
, jest tworzona jakok1
iffk2
nie występuje wk1
. - W przeciwnym razie sprawdzamy, czy
k1
i mają tę samą nazwę i stan, i ujednolicają ich odpowiednie argumenty.
Dla drugiego i trzeciego przypadku musimy zaimplementować kontrolę występowania, aby nie utknąć w nieskończonej pętli. Wątpię jednak, by programista mógł w ogóle stworzyć nieskończony rodzaj.
W Haskell, łatwo skonstruować nieskończony typu:
let f x = f
Jednak nie udało się skonstruować nieskończoną rodzaju bez względu na to jak bardzo się starałem. Zwróć uwagę, że nie korzystałem z żadnych rozszerzeń językowych.
Powodem Pytam to dlatego, jeśli to nie jest możliwe skonstruowanie nieskończoną rodzaju w ogóle to ja nawet nie przeszkadza wdrażającego występuje czek rodzaju w moim typie systemu.
A potem jakiś biedny SAP zarządza nim i tak staje się pomocny „niemożliwe stało” – Cubic
Dlaczego Twoje pytanie oznaczone Prolog i SML? Z tego co rozumiem, czytając go, to tylko o Haskell i nowego języka. – Kevin
@Kevin: Oba są słabe, ale nie całkowicie niepowiązane. OCaml ma bardzo podobny system typów do Haskella, a Prolog jest tam, gdzie idee unifikacji i kontroli pojawiają się (o ile wiem). W pewnym sensie tego rodzaju sprawdzanie typu jest bardzo podobne do uruchamiania programu Prolog. –