2011-12-19 25 views
6

Jak mogę powiedzieć, że Haskell interpretuje coś jako specjalny typ? Na przykład, mam listę i chcesz się podzielić jego długość przez 2. Więc piszęHaskell: "Cast"/typ siły?

(length mylist)/2 

i dostać ten błąd

Nie instancja dla (frakcyjną Int) wynikającej z zastosowania od `/”

jak chcę podział całego numeru, chciałbym aby length mylist, 2 i wynik Int.

+0

JFI Istnieje funkcja "rodzajowa długość" w 'Data.List'. W twoim przypadku nie zwróci ona odpowiedzi z pełnymi numerami, ale generalnie jest przydatna, ponieważ pozwala uniknąć niewygodnych wywołań 'fromIntegral'. –

+0

Potrzebuje więcej 'fromIntegral'. Poważnie jednak, 'fromIntegral' jest magicznym sposobem na" wyrzucenie "Int do wszystkiego, co tworzy egzemplarz typekl 'Num'. –

Odpowiedz

11

Są tu dwa różne problemy.

  • całkowita podział: Użycie div funkcję: div (length mylist) 2 lub (length mylist) `div` 2

  • odlewania. Można powiedzieć Haskellowi, że konkretne wyrażenie ma określony typ, pisząc expression :: type zamiast tylko expression. Nie oznacza to jednak "rzucania" lub "konwersji" wartości. Niektóre przydatne funkcje do konwertowania między różnymi typami liczbowymi i łańcuchowymi są następujące: fromIntegral, show, read, ,, Możesz sprawdzić je na Hoogle.

5

Wypróbuj div (length my list) 2. / dzieli ułamek; div robi podział liczb całkowitych.

+0

Ah, dzięki. A jak to zrobić w ogóle? Czy zawsze musisz trzymać się definicji typu funkcji? – user905686

+0

Istnieją funkcje, które umożliwiają konwersję z jednego typu na inny (np. Na liczbę całkowitą do ułamkowej), ale tak, natura Haskella jest taka, że ​​jeśli typy nie mieszczą się w definicji funkcji, użytkownik * * dostanie błąd. – mipadi