непостоянная константа, которая увеличивается на 1 для каждой оценки - PullRequest
1 голос
/ 06 октября 2019

Я очень новичок в Haskell и пытаюсь понять основы функционального программирования. Мне нужно создать не чистую константу next_nat :: Integer, которая при первой оценке дает 0, а затем увеличивается на 1 для каждой оценки. Затем мне также нужно вызвать его как параметр для чистой функции f, такой как f next_nat, и проверить результат в зависимости от оценки аргумента.

Я не уверен, как это сделать. Как я могу увеличить его для каждой оценки? Нужны ли другие переменные для этой задачи? Я только придумал это на данный момент:

next_nat :: Integer
next_nat = 0

f :: Integer -> Integer
f x = x+1

Я не думаю, что это правильно в этом смысле ..

1 Ответ

2 голосов
/ 06 октября 2019

Добро пожаловать в Stackoverflow. К сожалению, то, что вы просите, немного противоречиво. Как упоминал Робин, если типом является Integer, значение всегда будет одинаковым в Haskell.

Как вы говорите, ответ должен быть " не чистым ", возможное решениезаключается в привлечении монады IO. То есть вам придется разместить свою изменчивую сущность во «внешнем мире», то есть в монаде IO, если говорить о времени выполнения Haskell.

Примерно так:

$ ghci
GHCi, version 8.2.2: http://www.haskell.org/ghc/  :? for help
Prelude> 
Prelude> import Data.IORef
Prelude Data.IORef> mv <- newIORef ((0)::Integer)
Prelude Data.IORef> let next_nat = do { val <- readIORef mv ; modifyIORef' mv (\x -> 1+x) ; return val ; }
Prelude Data.IORef> 
Prelude Data.IORef> next_nat
0
Prelude Data.IORef> next_nat
1
Prelude Data.IORef> next_nat
2
Prelude Data.IORef> next_nat
3
Prelude Data.IORef> 

Подробнее см. В документации Data.IORef .

Печатная информация:

Prelude Data.IORef> :t mv
mv :: IORef Integer
Prelude Data.IORef> :t next_nat
next_nat :: IO Integer
Prelude Data.IORef> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...