【发布时间】:2016-01-20 16:55:46
【问题描述】:
我有以下代码:
while :: IO Bool -> IO () -> IO ()
while test body =
do b <- test
if b
then do {body ; while test body} -- same-line syntax for do
else return ()
我需要使用命令式编程来实现阶乘函数。我要做的是使用newIORef 创建和初始化变量,使用readIORef 和writeIORef 的while 循环修改它们的值,然后让IO 操作返回由输入n 和最终结果。
这是我到目前为止所做的:
fact :: Integer -> IO (Integer, Integer)
fact n = do r <- newIORef n --initialize variable
while
(do {v <- readIORef n; n})
(do {v <- readIORef r; writeIORef (...)) --modify the value (?)
readIORef r
这是我编写阶乘函数的尝试。这显然是行不通的。任何帮助将不胜感激。
【问题讨论】:
-
真的势在必行吗? ...哇,你有一个顽皮的老师......无论如何,我认为如果你添加另一个 variable 对你来说更容易 - 使用两个:一个 accumulator 你将结果和一个 index 您最多计数到
n(使用while模拟for循环) -
@Carsten 实际上,我发现这是一个很好的练习,可以检查是否有人知道如何使用
IORefs 并理解IO。当然,生成的代码预计很难阅读,而且非常单一。这绝对不是关于优雅的练习;-) -
嘿任何能帮助你学习的东西...... ;)
标签: haskell imperative-programming