3

我有一个任务是在 Haskell 中创建一个计算器程序。例如,用户将能够通过以下命令行使用计算器:

>var cola =5; //define a random variable
>cola*2+1;
(print 11)
>var pepsi = 10 
>coca > pepsi;
(print false)
>def coke(x,y) = x+y;  //define a random function
>coke(cola,pepsi);
(print 15)

//实际上它比上面更复杂

我不知道如何在 Haskell 中编程。我现在能想到的就是将命令行读取为字符串,将其解析为令牌数组。也许通过数组,检测诸如“var”、“def”之类的关键字,然后调用函数 var、def,它们将变量/函数存储在 List 或类似的东西中。但是,我如何存储数据以便以后在计算中使用它们呢?

我是否走在正确的轨道上,因为我实际上很困惑下一步该做什么?:(

*另外,我不允许使用 Parsec*

4

2 回答 2

3

看起来您有两种不同的输入:声明(创建新变量和函数)和表达式(计算事物)。

你应该首先定义一些数据结构,这样你就可以计算出你将要处理什么样的事情。就像是:

data Command = Define Definition | Calculate Expression | Quit
type Name = String
data Definition = DefVar Name Expression | DefFunc Name [Name] Expression
-- ^ alternatively, implement variables as zero-argument functions
-- and merge these cases
data Expression = Var Name | Add Expression Expression | -- ... other stuff
type Environment = [Definition]

首先,只需将内容解析(标记化然后解析标记)到 aCommand中,然后决定如何处理它。

表达比较容易。您假设您已经拥有所需的所有定义(an Environment),然后只需查找任何变量或进行添加或其他任何操作。

定义有点棘手。一旦决定了要创建什么新定义,就需要将其添加到环境中。你如何做到这一点取决于你如何准确地遍历这些行,但是你需要将新环境从解释器传递回获取下一行并在其上运行解释器的东西。就像是:

main :: IO ()
main = mainLoop emptyEnv
 where
  emptyEnv = []

mainLoop :: Environment -> IO ()
mainLoop env = do
  str <- getLine
  case parseCommnad str of
    Nothing -> do
      putStrLn "parse failed!"
      mainLoop env
    Just Quit -> do
      return ()
    Just (Define d) -> do
      mainLoop (d : env)
    Just (Calculate e) -> do
      putStrLn (calc env e)
      mainLoop env

-- the real meat:
parseCommand :: String -> Maybe Command
calc :: Environment -> Expression -> String -- or Integer or some other appropriate type

calc将需要在您创建的环境中查找内容,因此您可能还需要一个函数来查找Definition对应于给定的Name(或抱怨没有)。

您应该做出的其他一些决定:

  • 当有人试图重新定义变量时我该怎么办?
  • 如果我在函数定义中使用这些变量之一怎么办?我是否在创建或使用函数定义时对其进行评估?

这些问题可能会影响上述程序的设计,但我会留给你如何解决。

于 2013-02-23T23:28:54.993 回答
1

首先,您可以从本教程中学到很多关于 haskell 编程的知识

您需要使用 .hs 在另一个文档中编写函数
您可以从编译器加载文件并使用您创建的所有函数
例如

plus :: Int -> Int  -- that mean the function just work with a number of type int and return Int
plus x y = x + y    -- they receive x and y and do the operation 
于 2013-02-23T22:01:27.150 回答