Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 非纯常数,每次评估增加1_Haskell_Functional Programming_Purely Functional - Fatal编程技术网

Haskell 非纯常数,每次评估增加1

Haskell 非纯常数,每次评估增加1,haskell,functional-programming,purely-functional,Haskell,Functional Programming,Purely Functional,我是Haskell的新手,我试图了解函数式编程的基础知识。我需要创建一个非纯常量next_nat::Integer,它在第一次求值时产生0,然后在每次求值时增加1。然后,我还需要将其作为纯函数f的一个参数调用,比如f next_nat,并根据参数求值检查结果 我不知道该怎么做。我如何为每次评估增加它?此任务是否需要其他变量?我当时才想到这个: next_nat :: Integer next_nat = 0 f :: Integer -> Integer f x = x+1 我认为这样

我是Haskell的新手,我试图了解函数式编程的基础知识。我需要创建一个非纯常量
next_nat::Integer
,它在第一次求值时产生
0
,然后在每次求值时增加
1
。然后,我还需要将其作为纯函数
f
的一个参数调用,比如
f next_nat
,并根据参数求值检查结果

我不知道该怎么做。我如何为每次评估增加它?此任务是否需要其他变量?我当时才想到这个:

next_nat :: Integer
next_nat = 0

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

我认为这样做不对。

欢迎来到Stackoverflow。不幸的是,你的要求有点矛盾。正如Robin所提到的,如果类型是Integer,那么Haskell中的值将始终相同

正如您所说,答案必须是“非纯”,一个可能的解决方案是使用IO单子。也就是说,您必须将可变实体放在“外部世界”中,就Haskell运行时而言,这就是IO monad

大概是这样的:

$ 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> 

不能,如果它只是一个
整数
,就不能。这就是“纯功能”的部分含义。Haskell中有多种方法可以使用可变变量,但是类型系统需要警告用户潜在的可变性-诸如
Integer
之类的“纯类型”是严格不可变的。您可以使用
succ
而不是
f
。任务说明:“考虑Haskell由单个非纯常量
扩展而成的下一个\u nat::Integer
,它在第一次求值时得到0,然后得到1,2,等等对我来说,这也是矛盾的,因为常数应该是不变的。知道这意味着什么吗?@Felix:这是一个变量类型的常量:-)不,正式来说,这必须是一个返回整数值的IO操作。这不能称为常数,我同意其他评论家的观点。使用的语言有缺陷。如果类型真的是整数,它将始终是相同的值。@FelixErlacher一些更广泛的上下文可能会有所帮助,但对我来说,“考虑…”这句话清楚地表明,它是在谈论Haskell的一个假设(而不是实际存在的)“扩展”,它允许您这样做。然后我想指出,这将如何打破Haskell所依赖的许多东西-但正如我所说,上下文缺失。好吧,那么我可能甚至不理解任务。。。以下是任务描述的其余部分:在脚本中定义一个纯Haskell函数f,即在脚本中next_nat不得出现,这样表达式f next_nat的计算结果至少为三个不同的值,具体取决于使用的是按值调用、按名称调用、从左到右参数计算还是从右到左参数计算。“知道吗?我知道叫名字,叫价值。”。但与此任务结合使用的纯haskell函数的内容并不多。
Prelude Data.IORef> :t mv
mv :: IORef Integer
Prelude Data.IORef> :t next_nat
next_nat :: IO Integer
Prelude Data.IORef>