我是Haskell的新手,我自己学习,我正在运行程序,但我不了解循环。在我的程序中,我做了While循环,我将展示我的工作,但我需要解释有人解释循环如何做这句话,我做了
(let x = ref 0 in ( for (i=1 to 10 )(x:=deref x+i)));deref x )
。我使用了一些变量
如果你愿意,我可以把它展示给你们。
我做了这样的循环,它的工作原理
interp env (While b1 b2) = do
c1 <- interp env b1
case c1 of
(VBool True) -> do
interp env b2
interp env (While b1 b2)
(VBool False) -> return VNil
但是,我的循环工作是
interp env ( For s a1 a2 a3)= do
v1 <- interp env a1
v2 <- interp env a2
if (v1<v2 ) then do
x <- interp env a1
let env' = extendEnv x e1 env
interp env' a3
else return VNil
但是没有用,请你解释一下是什么问题?
答案 0 :(得分:2)
我在这个答案中做了以下假设,因为没有给出足够的信息来正确回答:
VInt
数据构造函数,与VBool
非常相似。我假设它包含Int
类型的单个值。extendEnv
有三个参数。第一个是变量ID(未知类型),第二个是将其绑定到的表达式(或者如果这种语言不是懒惰,则为未知类型的值),第三个是您正在扩展的环境(惊喜,惊喜) ,未知类型)。代码:
interp env (For var start end body) = do
(VInt s) <- interp env start
(VInt e) <- interp env end
if s < e
then
let nenv = extendEnv var start env in do
interp nenv body
interp nenv (For var (VInt (s - 1)) end body) -- Maybe only env here.
else return VNil
答案 1 :(得分:1)
我遇到了同样的问题,但也许我可以为我的情况提供一些更多的背景,也许这可以提供帮助。
使用typedef:
创建解释器interp :: Env -> Expr -> M Val
以这种格式处理 循环:
for ( var = expr to expr ) ( expr )
数据构造函数定义如下:
data Val =
ValInt Int
| ValBool Bool
| ValFun (Val -> M Val)
| ValRecFun (Val -> Val -> M Val)
| ValRef Loc
| ValNil
扩展环境定义为:
extendEnv :: Identifier -> Val -> Env -> Env
extendEnv var val (Env bs) = Env ((var,val):bs)
我在这里:
interp env (For x e1 e2 e3) = do
(ValInt v1) <- interp env e1
(ValInt v2) <- interp env e2
if (v1 < v2)
then
let nenv = extendEnv x e1 env in do
interp nenv e3
interp env (For x e1 e2 e3)
else return ValNil
显然,我不想将“e1”传递给for循环的递归调用,而是评估的“v1”变量递增....但我无法弄清楚如何将其传递给正确表达“v1”。这有足够的方向来获得一些帮助吗?:)
答案 2 :(得分:0)
我认为仅使用您提供的代码(类型错误?)来说明您的for循环有什么问题是不可能的。但是,如果你真的坚持可变状态,我会写你的for循环
(let x = ref 0 in ( for (i=1 to 10 )(x:=deref x+i)));deref x )
作为
import Control.Monad.State
forloop = snd $ runState (forM_ [1..10] incr) 0
incr n = modify (+n)
我可能不会再费心去抽象了。