【发布时间】:2017-08-21 11:20:58
【问题描述】:
背景
我是一名计划者,开始学习 Haskell。我正在尝试在 C 中实现一个 Scheme 解释器,遵循 SICP 的chapter 4。事实证明,直接用 C 语言编程太难了。所以我决定首先在 Haskell 中制作原型。在Write Yourself a Scheme in 48 Hours 的帮助下,我已经实现了除了变量、闭包和环境之外的所有内容。
问题
对IORef 的修改不会在main 的调用之间持续存在。我希望程序打印 (False) (True) (True) (True)... 但实际上它打印的是 (False) (True) (False) (True) (False )(真)...
精简版代码:
import Data.IORef
data SCM = Environment (IORef Bool) SCM | Empty'Environment
global :: IO SCM
global = Environment <$> newIORef False <*> pure Empty'Environment
print'' :: SCM -> IO ()
print'' ls =
case ls of
Empty'Environment -> pure ()
Environment first rest -> readIORef first >>= putStr . show >> print'' rest
print' :: SCM -> IO ()
print' ls = putStr "(" *> print'' ls *> putStrLn ")"
main :: IO ()
main = global >>=
\ls -> case ls of
Empty'Environment -> pure ()
Environment first _ -> print' ls *>
modifyIORef first (const True) *>
print' ls *>
main
感谢您的帮助!
【问题讨论】:
-
global用新的IORef创建新的SCM。您应该重新组织循环,其中global将执行一次。