Haskell GADT&x27;s和mtl变压器
我想使用GADT作为mtl monad transformer堆栈的返回值,但是GADT有一个类型*->*,除非约束为单个类型。mtl堆栈需要一个*符号,因此无法编译 我有一个monad转换器堆栈:Haskell GADT&x27;s和mtl变压器,haskell,monad-transformers,gadt,Haskell,Monad Transformers,Gadt,我想使用GADT作为mtl monad transformer堆栈的返回值,但是GADT有一个类型*->*,除非约束为单个类型。mtl堆栈需要一个*符号,因此无法编译 我有一个monad转换器堆栈: type ExceptStackCornerPointsBuilder = ExceptT String (StateT BuilderStateData (IO)) BuilderMonadData BuilderMonadData的返回类型有几个构造函数,它们必须相互交互: data Bui
type ExceptStackCornerPointsBuilder = ExceptT String (StateT BuilderStateData (IO)) BuilderMonadData
BuilderMonadData的返回类型有几个构造函数,它们必须相互交互:
data BuilderMonadData_GADT t where
BuilderMonadData_GPointIds_GADT :: [GPointId] -> BuilderMonadData_GADT
BuilderMonadData_CPoints_GADT :: [CPts.CornerPoints] -> BuilderMonadData_GADT [CPts.CornerPoints]
BuilderMonadData_Points_GADT :: [Pts.Point] -> BuilderMonadData_GADT [Pts.Point]
我想使用GADT约束它们的交互方式,但我不能,因为堆栈需要*但使用但使用builderMonadata_GADT会导致*->*因此它不会编译
为了得到一个*我需要约束到一个builderMonadata\u GADT构造函数,但是我不能,因为它们都是必需的。我已经拥有并使用了一个没有GADT的BuilderMonadData,它可以工作,但我只能在运行时捕获构造函数的糟糕组合,使用模式匹配和ExceptT中的throwE
有没有一种方法,使用GADT或其他方法,在编译时捕获这些约束,同时仍然使用具有多个构造函数和类型的ADT
代码位于github.com/heathweiss/ChampCad,但我还没有将此代码与GADT一起发布,并且它在一段时间内不太可能成为master分支。如果有人要求,我可以把它弄上去
没有GADT的版本位于:
和
类型ExceptStackCornerPointsBuilder t=ExceptT字符串(StateT BuilderStateData(IO))(BuilderMonadData t)
获取大量编译器错误,例如:获取大量有关将类型“t”与刚性类型(如“[CPts.CornerPoints]”匹配的编译器错误。似乎现在返回一个刚性类型而不是t是一个问题,但我将继续研究这个问题,看看我是否能解决它。我想我是在尝试不可能的事情。将*替换为*->*。好的一面是,键入ExceptStackCornerPointsBuilder t。。。但我看到,将实际类型(如[CornerPoints])添加到返回ExceptStackCornerPointsBuilder的函数声明中,可以清除这些编译器错误。这看起来是可行的。再过一两天我就知道了。将公布结果。你能提供更多关于你想排除的互动类型的细节吗?也许您可以指出引发当前使用的运行时错误的代码,作为示例?为什么不为每种类型的点单独设置一个monad(这看起来基本上是通过“添加实际类型”来实现的,但是是一种迂回的方式)?type ExceptStackCornerPointsBuilder t=ExceptT字符串(StateT BuilderStateData(IO))(buildermonadata t)
?获取大量编译器错误,例如:获取大量关于将类型“t”与刚性类型(如“[CPts.CornerPoints]”匹配的编译器错误。似乎现在返回一个刚性类型而不是t是一个问题,但我将继续研究这个问题,看看我是否能解决它。我想我是在尝试不可能的事情。将*替换为*->*。好的一面是,键入ExceptStackCornerPointsBuilder t。。。但我看到,将实际类型(如[CornerPoints])添加到返回ExceptStackCornerPointsBuilder的函数声明中,可以清除这些编译器错误。这看起来是可行的。再过一两天我就知道了。将公布结果。你能提供更多关于你想排除的互动类型的细节吗?也许您可以指出引发当前使用的运行时错误的代码,作为示例?为什么不为每种类型的点设置一个单独的monad(这看起来基本上是通过“添加实际类型”来实现的,但是以一种迂回的方式)?