【问题标题】:non-pure constant which increases by 1 for each evaluation非纯常数,每次评估增加 1
【发布时间】:2019-10-06 11:19:14
【问题描述】:

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

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

next_nat :: Integer
next_nat = 0

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

我不认为这样是对的..

【问题讨论】:

  • 你不能,如果它只是一个Integer。这就是“纯粹功能性”含义的一部分。在 Haskell 中存在可变变量的方法,但是类型系统需要警告用户潜在的可变性 - 诸如 Integer 之类的“纯类型”是严格不可变的。
  • 你可以用succ代替f

标签: haskell functional-programming purely-functional


【解决方案1】:

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

正如你所说的答案必须是“非纯”,一个可能的解决方案是让 IO monad 参与进来。也就是说,您必须将可变实体存放在“外部世界”中,即就 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> 

Data.IORef 文档中的更多详细信息。

输入信息:

Prelude Data.IORef> :t mv
mv :: IORef Integer
Prelude Data.IORef> :t next_nat
next_nat :: IO Integer
Prelude Data.IORef> 

【讨论】:

  • 任务说:“考虑通过单个非纯常量next_nat :: Integer 对 Haskell 进行扩展,第一次评估结果为 0,然后结果为 1,结果为 2,等等”。对我来说这也是矛盾的,因为常量应该是不可变的。知道这意味着什么吗?
  • @Felix:那么它是一个变量类型的常量 :-) 不,从形式上讲,这必须是一个返回整数值的 IO 操作。它不能被称为常数,我同意其他评论者的观点。使用的语言有问题。如果类型确实是 Integer,则它始终是相同的值。
  • @FelixErlacher 一些更广泛的背景会有所帮助,但对我来说,“考虑......”这句话清楚地表明它正在谈论 Haskell 的假设(实际上并不存在)“扩展”,这将允许你这样做。我想然后指出这将如何破坏 Haskell 所依赖的许多东西 - 但正如我所说,缺少上下文。
  • 好吧,那我可能连任务都看不懂了……这是任务描述的其余部分:“在脚本中定义一个单一的纯Haskell函数f,即在脚本中next_nat必须不出现,这样表达式 f next_nat 的求值至少得到三个不同的值,这取决于一个使用按值调用、按名称调用、从左到右的参数求值还是从右到左论证评估。”有什么想法吗?
  • 我知道按名称调用,按值调用。但与此任务相结合的纯 haskell 函数内容并不多。
猜你喜欢
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 2012-05-31
  • 2015-09-04
  • 1970-01-01
  • 2021-09-30
  • 2019-04-14
  • 2019-10-21
相关资源
最近更新 更多