Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell GADT&x27;s和mtl变压器_Haskell_Monad Transformers_Gadt - Fatal编程技术网

Haskell GADT&x27;s和mtl变压器

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

我想使用GADT作为mtl monad transformer堆栈的返回值,但是GADT有一个类型*->*,除非约束为单个类型。mtl堆栈需要一个*符号,因此无法编译

我有一个monad转换器堆栈:

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(这看起来基本上是通过“添加实际类型”来实现的,但是以一种迂回的方式)?