2013-07-28 14 views
5

Oczekuję następującego kodu, aby przekonwertować "15" na liczbę całkowitą i wydrukować wynik, ale spowoduje to błąd.

main = print $ read "15" :: Integer 

Couldn't match expected type `Integer' with actual type `IO()' 

Ale wystarczy użyć main = print (read "15" :: Integer) działa dobrze. Miałem wrażenie, że $ efektywnie otacza resztę linii w nawiasach. Dlaczego $ nie działa w tym przypadku?

Odpowiedz

12

$ nie jest cukrem składni, która stawia ( w obecnym miejscu i ) na końcu linii.

Tak więc print $ read "15" :: Integer jest interpretowane jako (print (read "15")) :: Integer. Dzieje się tak, ponieważ $ :: (a -> b) -> a -> b (operator infiksów składu funkcjonalnego) przyjmuje dwie funkcje: print i read "15" i "stosuje" je jedna za drugą. :: Integer wydaje się nie być tutaj funkcją, jest bardziej jak słowo kluczowe, więc $ nie działa tak, jak się spodziewałeś.

+10

Mówiąc zwięźle (ale nie całkiem poprawnie), '::' ma nawet niższy priorytet niż '$'. –

+0

Jest to cukier składniowy w Haskell. W przeciwnym razie nie działałoby to z argumentami typu "N". Jest to funkcja w języku PureScript. –

Powiązane problemy