有"类型级组合器"吗?他们将来会存在吗?

Raf*_*ini 17 haskell types combinators type-level-computation

许多事情让哈斯克尔非常好的在我看来,使用的组合程序,如(.),flip,$ <*>等这感觉就像当我需要我可以创建新的语法.

前段时间我正在做一些事情,如果我能"翻转"一个类型的构造函数,那将是非常方便的.假设我有一些类型构造函数:

m  :: * -> * -> * 
Run Code Online (Sandbox Code Playgroud)

并且我有一个类MyClass需要带有类型构造函数的类型* -> *.当然,我会选择以这样的方式对类型进行编码:

instance MyClass (m a) 
Run Code Online (Sandbox Code Playgroud)

但是假设我无法改变那些代码,并假设真正适合的代码MyClass就是这样

type w b = m b a 

instance MyClass w where 
    ...
Run Code Online (Sandbox Code Playgroud)

然后我必须激活XTypeSynonymInstances.有没有办法创建一个"类型级组合器" Flip,我可以这样做:

instance MyClass (Flip m a)  where 
   ...
Run Code Online (Sandbox Code Playgroud)

?? 或者我们在haskell中使用的常见运算符的其他类型级概括?这甚至是有用的还是我只是漫无目的?

编辑:

我可以这样做:

newtype Flip m a b = Flip (m b a)

newtype Dot m w a  = Dot m (w a)

...
Run Code Online (Sandbox Code Playgroud)

但后来我不得不使用这些数据构造Flip,Dot......各地进行模式匹配等是否值得呢?

gla*_*erl 11

你的问题是有道理的,但答案是:不,目前还不可能.

问题是(在GHC Haskell的类型系统中)你不能在类型级别拥有lambdas.对于你可能尝试的任何东西看起来它可以模拟或实现类型级别lambda的效果,你会发现它不起作用.(我知道,因为我做了.)

你可以做的是声明你的翻转新类型,然后编写你想要的类的实例,痛苦地包装和解包(顺便说一下:使用记录语法),然后类的客户端可以使用newtypes类型签名,而不必担心细节.

我不是一个类型理论家,我不知道为什么我们不能拥有类型级lambda的细节.我认为这与类型推断变得不可能有关,但我再也不知道了.

  • 对于类型级别的lambdas,您需要更高级别的统一,这是不可判定的.所以它一般不起作用. (3认同)