Haskell 可扩展GADT是表达式问题的可行解决方案吗?

Haskell 可扩展GADT是表达式问题的可行解决方案吗?,haskell,ghc,gadt,subtyping,Haskell,Ghc,Gadt,Subtyping,考虑下面的一厢情愿的计划 {-#语言可扩展GADTS} 数据免费a在哪里 提升::a->自由a 无数据(f a)=>自由函子f a其中 映射::(a->b)->自由函子f a->自由函子f b 实例函子(自由函子f),其中 fmap=地图 data FreeFunctor f a=>FreeApplication f a其中 应用::自由应用f(a->b)->自由应用f a->自由应用f b 纯::a->自由应用f a 实例Applicative(freeapplicive f)其中 ()=申请

考虑下面的一厢情愿的计划

{-#语言可扩展GADTS}
数据免费a在哪里
提升::a->自由a
无数据(f a)=>自由函子f a其中
映射::(a->b)->自由函子f a->自由函子f b
实例函子(自由函子f),其中
fmap=地图
data FreeFunctor f a=>FreeApplication f a其中
应用::自由应用f(a->b)->自由应用f a->自由应用f b
纯::a->自由应用f a
实例Applicative(freeapplicive f)其中
()=申请
纯的
data FreeApplication m a=>FreeMonad m a其中
绑定::freemonadma->(a->freemonadmb)->freemonadmb
实例Monad(FreeMonad m)其中
(>>=)=绑定
这将引入一个概念。例如,
freeapplicativefa
可以用
freeffunctor fa
代替,但不能用
FreeMonad fa
代替。类似地,
FreeApplicative fa->Int
可以被
freemand fa->Int
代替,但不能被
freeffunctor fa->Int
代替

可以通过注射捕捉到的概念

导入不安全。强制
fromFreeToFreeFunctor::Free(FA)->FreeFunctor FA
fromFreeToFreeFunctor=不安全
FromFreeFunctorOfReplicative::FreeFunctorF a->FreeApplicationF a
FromFreeFunctorOfReplicative=不安全
FromFreeApplicationVetOfReMonad::FreeApplicationive m a->FreeMonad m a
FromFreeApplicationOfRemonad=未安全
编译器将根据需要插入这些注入

我认为这是解决问题的好办法。然而,最重要的是,在Haskell中,亚型多态性会有问题。因此,我的问题有两个方面

  • 正如我上面所描述的,子类型是有问题的还是会干扰Haskell中的类型推断
  • 可扩展的GADT是Haskell中表达式问题的可行解决方案吗

  • 我还没有为可扩展的GADT定义精确的语义。如果这看起来是值得追求的,那么我想为此编写一个GHC扩展。我只是想把这个想法公之于众,并得到一些批评。

    我认为你不需要闲聊。Tom Schrijvers曾在Leuven Haskell用户组上发表过一次演讲: