我如何处理这个Haskell难度?

时间:2010-12-16 21:37:21

标签: haskell

我是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 

但是没有用,请你解释一下是什么问题?

3 个答案:

答案 0 :(得分:2)

我在这个答案中做了以下假设,因为没有给出足够的信息来正确回答:

  • 您的问题中有一个VInt数据构造函数,与VBool非常相似。我假设它包含Int类型的单个值。
  • extendEnv有三个参数。第一个是变量ID(未知类型),第二个是将其绑定到的表达式(或者如果这种语言不是懒惰,则为未知类型的值),第三个是您正在扩展的环境(惊喜,惊喜) ,未知类型)。
  • 输入AST已经过类型检查,所以我没有处理类型错误。

代码:

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)

我可能不会再费心去抽象了。