Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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
Variables Data.IORef与递归 Data.IORef_Variables_Haskell_Recursion_Io_Reference - Fatal编程技术网

Variables Data.IORef与递归 Data.IORef

Variables Data.IORef与递归 Data.IORef,variables,haskell,recursion,io,reference,Variables,Haskell,Recursion,Io,Reference,是否有任何理由认为上述方法中的一种优于另一种?与do块外部相比,包含递归的do块是否会降低程序的速度?如果你可以用一个函数替换Data.IORef的每个实例,那么Data.IORef为什么会存在呢?如果你的第一个版本中的{-Do stuff-}直接将继续修剪分配给某些计算的结果,当然,您可以轻松地重写它,以使该计算成为递归的条件,并消除IORef。这将是更好的解决办法 但是,如果您的第一个版本在其他函数中设置了keepRunning,那么等效的无引用版本可能会变得更加复杂。因此,在这种情况下,哪

是否有任何理由认为上述方法中的一种优于另一种?与do块外部相比,包含递归的
do
块是否会降低程序的速度?如果你可以用一个函数替换
Data.IORef
的每个实例,那么
Data.IORef
为什么会存在呢?

如果你的第一个版本中的
{-Do stuff-}
直接将
继续修剪
分配给某些计算的结果,当然,您可以轻松地重写它,以使该计算成为递归的条件,并消除
IORef
。这将是更好的解决办法

但是,如果您的第一个版本在其他函数中设置了
keepRunning
,那么等效的无引用版本可能会变得更加复杂。因此,在这种情况下,哪个版本更可取就不那么清楚了。尽管你可以指出,这样的事情一开始就是糟糕的设计。在不知道
{-Do stuff-}
实际做什么的情况下,很难说出任何具体的事情

与do块外部相比,包含递归的do块是否会降低程序的速度

没有

如果可以用函数替换Data.IORef的每个实例,那么Data.IORef为什么会存在呢

根据您使用的API,您可能无法(假设您在非FRP GUI库中有事件处理程序)。此外,在某些情况下,您可以删除IORef,但这只能通过影响性能和/或使代码更加复杂来实现


也就是说,您使用
IORef
作为循环条件的示例是,如果您的第一个版本中的
{-Do stuff-}
直接将
keepRunning
分配给某些计算的结果,那么您几乎肯定可以在不使用
IORef

的情况下编写更好的版本,当然,您可以轻松地重写它,以使该计算成为递归的条件,并消除
IORef
。这将是更好的解决办法

但是,如果您的第一个版本在其他函数中设置了
keepRunning
,那么等效的无引用版本可能会变得更加复杂。因此,在这种情况下,哪个版本更可取就不那么清楚了。尽管你可以指出,这样的事情一开始就是糟糕的设计。在不知道
{-Do stuff-}
实际做什么的情况下,很难说出任何具体的事情

与do块外部相比,包含递归的do块是否会降低程序的速度

没有

如果可以用函数替换Data.IORef的每个实例,那么Data.IORef为什么会存在呢

根据您使用的API,您可能无法(假设您在非FRP GUI库中有事件处理程序)。此外,在某些情况下,您可以删除IORef,但这只能通过影响性能和/或使代码更加复杂来实现


也就是说,您使用
IORef
作为循环条件的示例是,如果您的第一个版本中的
{-Do stuff-}
直接将
keepRunning
分配给某些计算的结果,那么您几乎肯定可以在不使用
IORef

的情况下编写更好的版本,当然,您可以轻松地重写它,以使该计算成为递归的条件,并消除
IORef
。这将是更好的解决办法

但是,如果您的第一个版本在其他函数中设置了
keepRunning
,那么等效的无引用版本可能会变得更加复杂。因此,在这种情况下,哪个版本更可取就不那么清楚了。尽管你可以指出,这样的事情一开始就是糟糕的设计。在不知道
{-Do stuff-}
实际做什么的情况下,很难说出任何具体的事情

与do块外部相比,包含递归的do块是否会降低程序的速度

没有

如果可以用函数替换Data.IORef的每个实例,那么Data.IORef为什么会存在呢

根据您使用的API,您可能无法(假设您在非FRP GUI库中有事件处理程序)。此外,在某些情况下,您可以删除IORef,但这只能通过影响性能和/或使代码更加复杂来实现


也就是说,您使用
IORef
作为循环条件的示例是,如果您的第一个版本中的
{-Do stuff-}
直接将
keepRunning
分配给某些计算的结果,那么您几乎肯定可以在不使用
IORef

的情况下编写更好的版本,当然,您可以轻松地重写它,以使该计算成为递归的条件,并消除
IORef
。这将是更好的解决办法

但是,如果您的第一个版本在其他函数中设置了
keepRunning
,那么等效的无引用版本可能会变得更加复杂。因此,在这种情况下,哪个版本更可取就不那么清楚了。尽管你可以指出,这样的事情一开始就是糟糕的设计。在不知道
{-Do stuff-}
实际做什么的情况下,很难说出任何具体的事情

与do块外部相比,包含递归的do块是否会降低程序的速度

没有

如果可以用函数替换Data.IORef的每个实例,那么Data.IORef为什么会存在呢

根据您使用的API,您可能无法(假设您在非FRP GUI库中有事件处理程序)。此外,在某些情况下,您可以删除IORef,但这只能通过影响性能和/或使代码更加复杂来实现

也就是说,您使用
IORef
作为循环条件的示例几乎可以肯定,在没有
IORef

的情况下,您可以编写一个更好的版本。您不能“用函数替换Data.IORef的每个实例”——您为什么相信这一点?简单地说
keepRunning <- newIORef True
let loop = do
    running <- readIORef keepRunning
    if running then
        do
            {- Do stuff -}
            loop running
            return ()
    else
        do
            {- Do stuff -}
            return ()
let keepRunning = True
let loop running = if running then
    do
        {- Do stuff -}
        loop running
        return ()
    else do
        {- Do stuff -}
        return ()
loop keepRunning