2015-08-07 16 views
9

Mam problem ze zrozumieniem, co dokładnie jest comparable w Elm. Wiąz wydaje się równie zdezorientowany jak ja.Co oznacza porównanie w Wiąz?

Na REPL:

> f1 = (<) 
<function> : comparable -> comparable -> Bool 

Więc f1 akceptuje porównawczych.

> "a" 
"a" : String 
> f1 "a" "b" 
True : Bool 

Wygląda na to, że String jest porównywalny.

> f2 = (<) 1 
<function> : comparable -> Bool 

Tak więc f2 akceptuje porównywalne.

> f2 "a" 
As I infer the type of values flowing through your program, I see a conflict 
between these two types: 

    comparable 

    String 

Więc Stringjest i nie porównywalne?
Dlaczego typ f2 nie jest number -> Bool? Jakie inne produkty porównawcze mogą akceptować?

Odpowiedz

6

Normalnie, gdy widzisz zmienną typu w elemencie w Wiąz, ta zmienna jest nieograniczona. Gdy następnie dostarczyć coś konkretnego typu, zmienna zostanie zastąpiona przez tego konkretnego typu:

-- says you have a function: 
foo : a -> a -> a -> Int 
-- then once you give an value with an actual type to foo, all occurences of `a` are replaced by that type: 
value : Float 
foo value : Float -> Float -> Int 

comparable jest zmienną typu z wbudowanym specjalnym znaczeniu. Oznacza to, że będzie on pasował tylko do "porównywalnych" typów, takich jak Int, String i kilka innych. Ale w przeciwnym razie powinno zachowywać się tak samo.Więc myślę, że jest trochę błędów w systemie typu, biorąc pod uwagę, że masz:

> f2 "a" 
As I infer the type of values flowing through your program, I see a conflict 
between these two types: 

    comparable 

    String 

Jeśli błąd nie było, co można uzyskać:

> f2 "a" 
As I infer the type of values flowing through your program, I see a conflict 
between these two types: 

    Int 

    String 

EDIT: I otworzyła issue dla tego błędu

+0

Dzięki. Widzę, że Evan zidentyfikował to jako błąd. – z5h

+0

Tak, będę edytować moją edycję :) – Apanatshka

1

Myślę, że to pytanie może być związane z this one. Int i String są zarówno comparable w tym sensie, że łańcuchy mogą być porównywane do łańcuchów i ints można porównać do ints. Funkcja, która może przyjmować dowolne dwa elementy porównania, będzie miała podpis comparable -> comparable -> ..., ale w ramach jednej oceny funkcji obydwa składniki muszą być tego samego typu.

Wierzę powodem f2 jest niejasna powyżej jest to, że 1 jest number zamiast typu betonowego (co wydaje się zatrzymać kompilator z uznając, że musi być porównywalny z pewnego rodzaju, prawdopodobnie należy ustalić). Jeśli było zrobić:

i = 4 // 2 
f1 = (<) i -- type Int -> Bool 
f2 = (<) "a" -- type String -> Bool 

można zobaczyć to faktycznie robi załamanie comparable do odpowiedniego typu, kiedy to możliwe.

1

zaczerpnięte z docs wiąz: - here

porównywalnych typów obejmuje numbers, characters, strings, lists of comparable things i tuples of comparable things. Zauważ, że krotki z 7 lub więcej elementami nie są porównywalne; dlaczego twoje krotki są tak duże?

oznacza to, że:

[(1,"string"), (2, "another string")]: List (Int, String) - porównywalne

jednak posiadające

(1, "string", True): (Int, String, Bool) lub

[(1,True), (2, False)]: List (Int, Bool) - są nieporównywalne jeszcze z.

Kwestia ta została omówiona here

Uwaga: Zazwyczaj ludzie napotykają problemy z typem comparable kiedy próbują użyć typu unia jako Key w Dict.

Tagi i konstruktory typów związków nie są porównywalne. Tak więc poniżej nie kompiluje się.

type SomeUnion = One | Two | Three 
Dict.fromList [ (One, "one related"), (Two, "two related") ] : Dict SomeUnion String 

Zazwyczaj podczas próby to zrobić, nie ma lepsze podejście do struktury danych. Ale dopóki nie zostanie podjęta decyzja - można użyć AllDict.

+1

Wygląda na to, że czytasz tytuł mojego pytania, ale nie pełną treść. Moje zamieszanie w czasie pytania było spowodowane błędem w kompilatorze. Odpowiedź wybrana jako poprawna odwołuje się do błędu. https://github.com/elm-lang/elm-compiler/issues/1013 – z5h

+0

@ z5h tak, masz rację w tym względzie. Mimo to uważam, że moja odpowiedź jest trafna, ponieważ to pytanie jest pierwszą rzeczą, która pojawia się w Google - kiedy osoba nowa z wiązów próbuje zrozumieć, co "porównywalne" oznacza ***. Moja odpowiedź jest dla nich - ponieważ sam straciłem 20 minut - aby zrozumieć ** co dokładnie to porównywalne jest ** - zdziwiło mnie, że "Bools" nie są na przykład porównywalne. Wybrana odpowiedź wyjaśnia: "Int, String i kilka innych" - niezbyt konkretna.Właśnie dlatego zawarłem fragment elfa-docs. – AIon