【发布时间】:2013-02-24 19:51:07
【问题描述】:
我正在为 Haskell 中的动态类型语言编写解释器。
像大多数动态类型的语言解释器一样,我的程序也需要在运行时检查类型。我的程序中最常用的代码之一是:
interpreterFunction :: Value -> SomeMonadicContext ReturnType
interpreterFunction p = do
VStr s <- ensureType p TString
..
some code that uses s
这里我确保p 具有TString 类型,然后我使用VStr s <- ... 对其进行解构。这永远不会失败,因为VStr 是唯一具有TString 类型的值。
我的数据结构基本上是这样的:
data Value = VStr String | VInt Int | VBool Bool
data Type = TStr | TInt | TBool
所以我根据它们的类型来区分我的值。 IE。我只有一个具有TStr 类型的值构造函数。
现在我想知道是否有办法简化我的ensureType 函数和解构代码。例如,这样的事情是否可能:
interpreterFunction p = do
s <- ensureType p
..
same code that uses s
这里从s <-之后的代码可以推导出s的类型是String,并且静态知道只有Value构造函数有String部分是VStr,所以@ 987654339@ 在动态检查p 是否为VStr 后返回String。
我实际上不知道这是否有意义或可能。我只是想借助 Haskell 的高级类型系统功能来改进我的设计。
任何帮助将不胜感激。
【问题讨论】:
-
这可能有助于描述
ensureType在存在非TString 数据时的效果。 -
目前看来您可以使用模式匹配将其重写为
interpreterFunction (VStr s) = some code that uses s,后跟interpreterFunction _ = some error handling code。否则我认为您应该仔细查看pattern guards,因为它们可能会对您的代码产生澄清作用。 -
您的要求是有道理的,听起来TypeFamilies 就是您正在寻找的(尽管不一定是唯一或最佳的解决方案)。它们允许您定义“类型函数”(例如,从
String到VStr,其中VStr是一种新类型),可以是单射的,也可以不是单射的。 -
@AndrewC,简单的模式匹配对我不起作用,因为我在问题中没有提到一些细节。基本上我也想从它到
throwError $ TypeError expected found做一些其他的事情。 -
@jberryman 谁能给我一些关于 TypeFamilies 如何提供帮助的建议?
标签: haskell interpreter dynamic-typing