如何强制执行一个函数,然后 return haskell 中的一个简单的东西
How to force execution of a function and then return a simple something else in haskell
所以我正在制作我自己的原始 shell 语言解析器,我想我会制作我的命令(例如 cd)表达式,以便我可以为它们留下一些 space return 值。
现在我做了某种解析器,并且在我的语句消费者中有一个裸露的表达式。
为了您的方便,我希望不必向您提供整个代码。这是有问题的部分:
-- it has other patterns...
makeStatement :: Statement -> VarTable -> Maybe VarTable
makeStatement (Exp exp) vt = ???
makeStatement (If ..........
...
data Expression = Val Int
| Booly Bool
| Var String
| Cmd String [String]
deriving (Show)
data Statement = Assignment String Expression
| If Expression Statement
| IfElse Expression Statement Statement
| Exp Expression
deriving (Show)
eval :: VarTable -> Expression -> Maybe Int
所以我想强制执行 exp,以防它是 Cmd
但 return 与它开始的 vt 相同。
首先,您可能需要一些复合类型来表示您的表达式可以使用的三种可能类型 return。
像
data Value = Number Int | Boolean Bool | String String | Unit
Unit
一个用于不 return 任何内容的表达式。
现在,由于 some 你的表达式可能有副作用,你肯定必须将 everything 包装到 IO 中。有没有纯表达式并不重要,因为编译器不知道哪个是哪个。
eval :: VarTable -> Expression -> IO Value
现在您的 makeStatement
(类似于 runStatement
可能是更好的名字)看起来像这样
makeStatement :: Statement -> VarTable -> IO VarTable
makeStatement (Exp exp) vt = eval exp >> return vt
makeStatement (If cond th) vt = do
c <- eval cond
case c of
Boolean True -> makeStatement th vt
_ -> return vt --maybe handle the case where c isn't even Boolean
...
通过此设置,您可以看到我们可以完成我猜您想要的操作。 eval
uate 表达式,然后丢弃它的结果,只是 return VarTable
不变。
所以我正在制作我自己的原始 shell 语言解析器,我想我会制作我的命令(例如 cd)表达式,以便我可以为它们留下一些 space return 值。
现在我做了某种解析器,并且在我的语句消费者中有一个裸露的表达式。
为了您的方便,我希望不必向您提供整个代码。这是有问题的部分:
-- it has other patterns...
makeStatement :: Statement -> VarTable -> Maybe VarTable
makeStatement (Exp exp) vt = ???
makeStatement (If ..........
...
data Expression = Val Int
| Booly Bool
| Var String
| Cmd String [String]
deriving (Show)
data Statement = Assignment String Expression
| If Expression Statement
| IfElse Expression Statement Statement
| Exp Expression
deriving (Show)
eval :: VarTable -> Expression -> Maybe Int
所以我想强制执行 exp,以防它是 Cmd
但 return 与它开始的 vt 相同。
首先,您可能需要一些复合类型来表示您的表达式可以使用的三种可能类型 return。 像
data Value = Number Int | Boolean Bool | String String | Unit
Unit
一个用于不 return 任何内容的表达式。
现在,由于 some 你的表达式可能有副作用,你肯定必须将 everything 包装到 IO 中。有没有纯表达式并不重要,因为编译器不知道哪个是哪个。
eval :: VarTable -> Expression -> IO Value
现在您的 makeStatement
(类似于 runStatement
可能是更好的名字)看起来像这样
makeStatement :: Statement -> VarTable -> IO VarTable
makeStatement (Exp exp) vt = eval exp >> return vt
makeStatement (If cond th) vt = do
c <- eval cond
case c of
Boolean True -> makeStatement th vt
_ -> return vt --maybe handle the case where c isn't even Boolean
...
通过此设置,您可以看到我们可以完成我猜您想要的操作。 eval
uate 表达式,然后丢弃它的结果,只是 return VarTable
不变。