有“类型级组合子”吗?它们将来会存在吗?

18
在我看来,Haskell真正好用的部分是组合子(如(.)flip$<*>等)。当需要时,我几乎可以创建新的语法。
以前有一段时间,我在做某件事情,如果能够"翻转"一个类型构造函数,那将非常方便。假设我有一个类型构造函数:
m  :: * -> * -> * 

我有一个类 MyClass,需要具有带有种类为* -> *的类型构造函数。自然而然地,我会选择以这种方式编写类型:

instance MyClass (m a) 

但是假设我无法更改那段代码,而且假设真正适合放入MyClass中的内容像这样

type w b = m b a 

instance MyClass w where 
    ...

然后我就必须激活XTypeSynonymInstances。有没有一种创建“类型级组合器”Flip的方法,使得我可以这样做:

instance MyClass (Flip m a)  where 
   ...

在Haskell中,是否存在类似于“??”这样的通用运算符的类型级别泛化?这真的有用吗,还是我在胡言乱语?

编辑:

我可以做类似这样的事情:

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

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

...

但如果这样做,我就必须在模式匹配等情况下使用数据构造函数FlipDot等。这样值得吗?


1
您可能也想查看http://hackage.haskell.org/cgi-bin/hackage-scripts/package/TypeCompose。 - Alexey Romanov
1
“它们将来会存在吗?” 好吧,GHC 开源的...去试试吧。 :) 或者你可以向博士课程投入大量资金,并告诉他们为你完成这项任务。 - Dan Burton
@DanBurton 哈哈,你说得对。我应该这样表达:“是否有任何当前的项目旨在将类似内容包含在 GHC 中?” - Rafael S. Calsaverini
1
我曾经问过一个类似的问题:https://dev59.com/Q2sz5IYBdhLWcg3wR1vC 。其中一些回答可能也能帮到你。 - David Miani
3个回答

11

你的问题很有意义,但答案是:目前不可能。

问题在于(在GHC Haskell的类型系统中)你无法在类型级别上使用lambda。对于任何你尝试看起来可以模拟或实现类型级别lambda效果的东西,你会发现它不起作用。(我知道,因为我试过。)

你可以声明Flip的新类型,然后为它们编写类的实例,痛苦地进行包装和解包操作(顺便说一下:使用记录语法),然后类的客户端可以在类型签名中使用新类型而不必担心细节问题。

我不是类型理论家,也不知道为什么我们不能在类型级别上使用lambda的详细信息。我认为这与类型推断变得不可能有关,但我并不真正知道。


3
对于类型级的 lambda,你需要进行高阶升一致性,但这是不可判定的。因此它在一般情况下无法运行。 - augustss

3

您可以尝试以下操作,但我认为实际上并不是非常有用,因为您仍然无法真正地部分应用它:

{-# LANGUAGE TypeFamilies, FlexibleInstances #-}
module Main where

class TFlip a where
    type FlipT a

instance TFlip (f a b) where
    type FlipT (f a b) = f b a 

-- *Main> :t (undefined :: FlipT (Either String Int))
-- (undefined :: FlipT (Either String Int)) :: Either Int [Char]

请参阅此前的讨论:Haskell中用于类型表达式的Lambda?


2
你不需要一个类来声明一个类型族。上述内容可以简化为只需编写 module Main where { type family FlipT a; type instance FlipT (f a b) = f b a } - Daniel Wagner

2

我在这里写答案只是为了澄清事情并介绍过去几年的成就。 Haskell 中有很多功能,现在您可以在类型中编写一些运算符。使用$,您可以编写类似以下内容的内容:

foo :: Int -> Either String $ Maybe $ Maybe Int

为了避免使用括号,可以使用传统的方法。
foo :: Int -> Either String (Maybe (Maybe Int))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接