gpt4 book ai didi

Haskell:需要计算器程序的启发

转载 作者:行者123 更新时间:2023-12-02 10:52:33 27 4
gpt4 key购买 nike

我有一个作业是用 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 中对此进行编程。我现在能想到的就是将命令行作为字符串读取,将其解析为 token 数组。也许遍历数组,检测诸如“var”、“def”之类的关键字,然后调用函数 var、def 将变量/函数存储在列表或类似的东西中。但是我该如何存储数据以便稍后在计算中使用它们呢?

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

*此外,我不允许使用秒差距!*

最佳答案

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

您应该首先定义一些数据结构,以便您可以弄清楚您将要处理什么类型的事情。像这样的东西:

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]

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

表达式相对简单。您假设您已经拥有所需的所有定义(环境),然后只需查找任何变量或进行添加或执行其他操作。

定义有点棘手。一旦决定了要进行什么新定义,您需要将其添加到环境中。具体如何执行此操作取决于您迭代各行的准确程度,但您需要将新环境从解释器传递回获取下一行并在其上运行解释器的事物。像这样的东西:

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 对应于给定的名字(或者提示没有名字)。

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

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

这些问题可能会影响上述程序的设计,但我将让您自行决定如何实现。

关于Haskell:需要计算器程序的启发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15046196/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com