我正在为 Haskell 中的动态类型语言编写解释器。
像大多数动态类型的语言解释器一样,我的程序也需要在运行时检查类型。我的程序中最常用的代码之一是:
interpreterFunction :: Value -> SomeMonadicContext ReturnType
interpreterFunction p = do
VStr s <- ensureType p TString
..
some code that uses s
在这里我确保它p
有 type TString
,然后我用VStr s <- ...
. 这永远不会失败,因为VStr
它是唯一具有 type 的值TString
。
我的数据结构基本上是这样的:
data Value = VStr String | VInt Int | VBool Bool
data Type = TStr | TInt | TBool
所以我根据它们的类型来区分我的值。IE。我只有一个具有TStr
as 类型的值构造函数。
现在我想知道是否有办法简化我的ensureType
函数和解构代码。例如,这样的事情是否可能:
interpreterFunction p = do
s <- ensureType p
..
same code that uses s
这里从后面的代码s <-
可以推导出它s
有类型String
,并且静态知道只有Value
构造函数有一个String
部分VStr
,所以动态检查是否是a后ensureType
返回。String
p
VStr
我实际上不知道这是否有意义或可能。我只是想借助 Haskell 的高级类型系统功能来改进我的设计。
任何帮助将不胜感激。