我有一个任务是在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中编程。我现在能想到的就是将命令行作为String读取,将其解析为一个令牌数组。也许通过数组,检测关键字如“var”,“def”然后调用函数var,def,它将变量/函数存储在List或类似的东西中。但是,我如何存储数据以便以后在计算中使用它们?
我也是在正确的轨道上,因为我真的很困惑下一步做什么? :(
* 此外,我不允许使用Parsec ! *
答案 0 :(得分: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]
首先,只需解析(标记,然后将标记解析,然后将这些标记解析为Command
,然后决定如何处理它。
表达相对容易。您假设您已经拥有了所需的所有定义(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
(或抱怨没有)。
您应该做出的其他一些决定:
这些问题可能会影响上述计划的设计,但我会由您决定如何解决。
答案 1 :(得分:0)
首先,您可以从tutorial for haskell programming
中学到很多东西您需要在另一个带有.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