2015-06-11 8 views
7

Jestem nowy w wiązach i ogólnie programowaniu funkcjonalnym. Dostawałem zagadkową niezgodność typów, wykonując podział z wezwaniem do "pokazania". Ten kod powoduje niedopasowanie:W Elm, dlaczego jest to niedopasowanie typu Int-Float?

import Graphics.Element exposing (..) 

columns = 2 
main = placePiece 10 

placePiece: Int -> Element 
placePiece index = 
    show (index/columns) 

kod produkuje ten błąd:

Type mismatch between the following types on line 9, column 3 to 22:

Int 

    Float 

It is related to the following expression:

show (index/columns) 

które czytałem oznaczać, że oczekuje i Int, ale dostał pływaka. Ale pokaż działa z dowolnego typu. Jeśli użyję podłogi, aby wymusić podział na Int, otrzymam ten sam błąd. Ale jeśli mocno zakodowuję liczby, np. show (10/2) Działa dobrze.

Więc jaka część powyższego kodu spodziewa się uzyskać Int?

Odpowiedz

8

Powód błędu

Właściwie w tym przypadku kompilator spodziewa się Float ale coraz Int. Parametr Int jest argumentem funkcji i oczekuje, że argumenty będą w postaci.

Dlaczego numery dosłowne pracować

Po prostu trudno numery kodu, kompilator może dowiedzieć się, że chociaż używasz liczb całkowitych, można wykorzystać je jako Float zamiast Int.

Fixing błąd

Istnieją trzy sposoby, aby naprawić ten błąd. Jeśli naprawdę chcesz, aby zaakceptować Int ale chcą zmiennoprzecinkowych podział, będziesz musiał obrócić się całkowitą liczbę zmiennoprzecinkową:

import Graphics.Element exposing (..) 

columns = 2 
main = placePiece 10 

placePiece: Int -> Element 
placePiece index = 
    show (toFloat index/columns) 

jeśli jesteś ok z funkcji placePiece biorąc liczbę zmiennoprzecinkową ty można zmienić podpis wpisz:

import Graphics.Element exposing (..) 

columns = 2 
main = placePiece 10 

placePiece: Float -> Element 
placePiece index = 
    show (index/columns) 

Jeśli chciał podział liczby całkowitej, można użyć operatora Basics.(//):

import Graphics.Element exposing (..) 

columns = 2 
main = placePiece 10 

placePiece: Int -> Element 
placePiece index = 
    show (index//columns) 
+0

W tym przypadku chciałem całkowitą podział , więc trzecia opcja była doskonała. Dziękuję również za wyjaśnienie, dlaczego literały działały. Sądziłem, że kompilator zinterpretuje literał jako float, jeśli umieścisz coś w rodzaju 'x = 1.0', z twardym, kodowanym miejscem dziesiętnym. – Tony

Powiązane problemy