Kod nie jest kompilowany, ponieważ typy nie są zgodne. Chodźmy załadować sesję GHCI i spojrzeć na rodzaje funkcji jesteś korzystających -
> :t writeFile
writeFile :: FilePath -> String -> IO()
>
> :t readFile
readFile :: FilePath -> IO String
Więc writeFile
chce FilePath
i String
. Chcesz uzyskać String
od readFile
- ale readFile
zwraca IO String
zamiast String
.
Haskell jest bardzo prymitywnym językiem.Ma rozróżnienie między czystymi funkcjami (które dają te same wyjścia za każdym razem, gdy są wywoływane z tymi samymi argumentami) i nieczytelnym kodem (co może dawać różne wyniki, np. Jeśli funkcja zależy od niektórych danych wprowadzonych przez użytkownika). Funkcje dotyczące wejścia/wyjścia (IO) zawsze mają typ zwrotu oznaczony jako IO
. System typów zapewnia, że nie można użyć nieczytelnego kodu IO
w czystych funkcjach - na przykład zamiast zwracać String
funkcja readFile
zwraca IO String
.
W tym miejscu ważna jest notacja <-
. Dzięki niemu możesz uzyskać numer String
wewnątrz IO
i zapewnia to, że cokolwiek robisz z tym ciągiem, definiowana funkcja będzie zawsze oznaczona jako IO
. Porównaj następujące -
> let x = readFile "tmp.txt"
> :t x
x :: IO String
który nie jest to, co chcemy, aby ten
> y <- readFile "tmp.txt"
> :t y
y :: String
co jest, co chcemy. Jeśli kiedykolwiek masz funkcję, która zwraca IO a
i chcesz uzyskać dostęp do a
, musisz użyć <-
, aby przypisać wynik do nazwy. Jeśli twoja funkcja nie zwraca IO a
, lub jeśli nie chcesz dostać się do a
wewnątrz IO
, możesz po prostu użyć =
.
Musisz zrozumieć, jak Monad de-sugaring ma pojęcie o tym, jak to pasuje. – Sibi
@Sibi jest technicznie prawdą, ale uważam, że powinno być możliwe udzielenie odpowiedzi na to pytanie bez wspominania o M-word. W końcu m *** ds jest tylko jednym ze sposobów radzenia sobie z IO w czystym języku. Haskell nadal miałby separację między czystym a nieczytelnym kodem, nawet gdyby nie miał wbudowanego m **** ds, a ten problem (lub taki jak on) nadal istniałby. –
@ChrisTaylor Chociaż można odpowiedzieć na to pytanie bez wyjaśnienia Monad, naprawdę wątpię, czy pomoże to OP w uchwyceniu tej koncepcji. Biorąc to pod uwagę, tutaj jest wiele dobrych odpowiedzi. – Sibi