28

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 | 
+---------+---------+-------------------------------------------------------+ 
  1. Kiedy zarówno k1 i k2 są zmiennymi następnie są one tworzone wystąpienia do siebie.
  2. Gdy tylko k1 jest zmienną, jest tworzony jako k2 iff k1 nie występuje w k2.
  3. Gdy zmienna ma tylko k2, jest tworzona jako k1 iff k2 nie występuje w k1.
  4. 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.

+4

A potem jakiś biedny SAP zarządza nim i tak staje się pomocny „niemożliwe stało” – Cubic

+2

Dlaczego Twoje pytanie oznaczone Prolog i SML? Z tego co rozumiem, czytając go, to tylko o Haskell i nowego języka. – Kevin

+2

@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. –

Odpowiedz

33
data F f = F (f F) 

Na GHC 7.10.1, otrzymuję komunikat:

kind.hs:1:17: 
    Kind occurs check 
    The first argument of ‘f’ should have kind ‘k0’, 
     but ‘F’ has kind ‘(k0 -> k1) -> *’ 
    In the type ‘f F’ 
    In the definition of data constructor ‘F’ 
    In the data declaration for ‘F’ 

komunikat nie powiedzieć, że jest nieskończony miły, ale to w zasadzie co to jest, gdy następuje sprawdzenie się nie powiedzie.

26

Innym prostym przykładem

GHCi, version 7.10.1: http://www.haskell.org/ghc/ :? for help 
Prelude> let x = undefined :: f f 

<interactive>:2:24: 
    Kind occurs check 
    The first argument of ‘f’ should have kind ‘k0’, 
     but ‘f’ has kind ‘k0 -> k1’ 
    In an expression type signature: f f 
    In the expression: undefined :: f f 
    In an equation for ‘x’: x = undefined :: f f