мета-данные страницы
Загрузка не удалась. Возможно, проблемы с правами доступа?
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версияСледующая версияСледующая версия справа и слева | ||
haskell [15/09/2018 15:00] – [2.6 Использование монады состояния] vlasov | haskell [23/09/2018 19:18] – [3.1 Полезные базовые функции для работы со списками] vlasov | ||
---|---|---|---|
Строка 383: | Строка 383: | ||
</ | </ | ||
- | Вот версия более простого и понятного примера: | + | < |
+ | Как показали дальнейшие изыскания, | ||
+ | [[https:// | ||
+ | < | ||
+ | Prelude> :set -XMonomorphismRestriction | ||
+ | Prelude> let x = 2 | ||
+ | Prelude> x + 2.0 | ||
+ | |||
+ | < | ||
+ | * No instance for (Fractional Integer) | ||
+ | arising from the literal `2.0' | ||
+ | ... | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | Вот версия более простого и понятного примера, без странностей ограничения мономорфизма: | ||
<code haskell> | <code haskell> | ||
Строка 394: | Строка 410: | ||
In an equation for `it': it = x + y | In an equation for `it': it = x + y | ||
</ | </ | ||
- | В языках типа Си это соответствовало бы объявлению и инициализации переменных типа | + | В языках типа Си это соответствовало бы объявлению и инициализации переменных типа |
==== 2.6 Использование монады состояния==== | ==== 2.6 Использование монады состояния==== | ||
Строка 402: | Строка 418: | ||
import Control.Monad.State | import Control.Monad.State | ||
- | fact' :: Integer -> State Integer Integer -- тип состояния - Int, тип результата - тоже | + | fact' :: Integer -> State Integer Integer |
+ | -- тип состояния - Integer, тип результата - тоже | ||
fact' 0 = do | fact' 0 = do | ||
acc <- get -- получаем накопленный результат | acc <- get -- получаем накопленный результат | ||
Строка 411: | Строка 428: | ||
fact' (n - 1) -- продолжаем вычисление факториала | fact' (n - 1) -- продолжаем вычисление факториала | ||
- | -- fact :: Int -> Int | + | -- fact :: Integer |
fact n = fst $ runState (fact' n) 1 -- начальное значение состояния = 1 | fact n = fst $ runState (fact' n) 1 -- начальное значение состояния = 1 | ||
</ | </ | ||
Строка 437: | Строка 454: | ||
(везде ниже '' | (везде ниже '' | ||
+ | * '' | ||
* '' | * '' | ||
* '' | * '' |