2017-05-28 15 views
6

Widziałem ten kod kompilowany bez błędów i nie mogę powiedzieć, czy jest to błąd, czy też jest oczekiwany.Określanie typu parametrycznego nie jest wymuszane przez kompilator - czy jest to błąd, czy jest oczekiwany?

type alias Foo = List 
vs 
type alias Foo = List String 

i to nie tylko z List. Niestandardowe typy związków są również dozwolone. Ex:

type State value = Valid value | Invalid value 

type alias Model1 = 
    { someField : State String } -- i would say this is normal. State is a string.. 

type alias Model2 = 
    { someField : State } -- this doesn't look right. 

a także funkcje mogą

function1 : List String -> Int 
function1 aListOfStrings = 
    1 

function2 : List -> Int 
function2 whatisThisNow = 
    1 

Ale jeśli oczekuje się - jak rozumowania na ten temat? Nie mogę otoczyć się tym. Zagraj z nim here.

+0

Pierwszy przykład wygląda mi dobrze: pozwoliłoby to na wykonywanie aplikacji typu częściowego. Ale dwa pozostałe wyglądają rzeczywiście jak coś, co powinno być ograniczone (ponieważ nie ma wartości, której typem jest funkcja typu). –

+0

To wydaje się być mylące. Prawdopodobnie uzyskasz więcej informacji zwrotnej, jeśli zapytasz o Slack: http://elmlang.herokuapp.com/ – hkgumbs

Odpowiedz

1

Pierwsza wygląda dobrze. Zdefiniowanie type alias Foo = List powinno umożliwić użycie Foo zamiast List. Ale to nie skompilować (z Elm 0,18):

type alias Foo = List 

names : Foo String --does not compile 
names = ["a", "b"] 

Wydaje się, że aliasy typu nie są w pełni sprawdzone, gdy oświadczył, więc możliwe jest, aby tworzyć aliasy typu, które nie mogą być wykorzystywane w ogóle.

W pierwszym przykładzie kompilator można naprawić, aby właściwie go obsługiwać. Drugi przykład powinien być błędem czasu kompilacji, ponieważ nie ma sposobu, aby kiedykolwiek uzyskać wartość typu List (lub State). Haskellerowie powiedzieliby, że List (lub State) ma rodzaj * -> *, ale wartości w środowisku wykonawczym mogą mieć tylko rodzaj *.

Chyba znalazłeś błąd w aktualnej wersji Elm (0,18)


ciekawe, zmieniając powyższy kod do

type alias Foo a = List a 

names : Foo String 
names = ["a", "b"] 
-- compiles with Elm 0.18 

sprawia, że ​​działa poprawnie .. Te dwa fragmenty kodu powinny być jednakowo równoważne.