gpt4 book ai didi

haskell - 像函数一样组合类型构造函数

转载 作者:行者123 更新时间:2023-12-02 21:32:22 25 4
gpt4 key购买 nike

我最近遇到了一种情况,我希望能够在实例声明中编写类型构造函数。我本来想这样做:

instance (SomeClass t, SomeClass t') => SomeClass (t . t') where

其中 (t . t') 定义为 (t . t') a = t (t' a) (因此 tt' 具有类型 * -> *。我们可以部分应用类型构造函数,就像函数一样,那么我们不能组合它们的原因是什么?另外,是否有可能我想要实现的目标的解决方法?也许有平等约束?

(我确实知道 Control.Compose 存在,但它只是创建一个 newtype 包装器 - 我想要一个类型同义词)。

最佳答案

(I do know that Control.Compose exists, but it simply creates a newtype wrapper - I would like a type synonym).

这在 Haskell 中是不允许的。类型同义词必须完全应用:不能写 Compose t t',只能写 Compose t t' a

允许部分应用类型同义词会导致类型级 lambda,这使得类型推断不可判定,因此 Haskell 中缺乏对它的支持。

<小时/>

例如,(启用所有相关的 GHC 扩展)

type Compose t t' a = t (t' a)
data Proxy (k :: * -> *) = Proxy

pr :: Proxy (Compose [] [])
pr = Proxy

结果:

 Type synonym ‘Compose’ should have 3 arguments, but has been given 2
In the type signature for ‘pr’: pr :: Proxy (Compose [] [])

同样,

class C k where f :: k Int -> Int
instance C (Compose [] []) where f _ = 6

产量:

Type synonym ‘Compose’ should have 3 arguments, but has been given 2
In the instance declaration for ‘C (Compose [] [])’

这是一个允许类型同义词部分应用的示例(启用LiberalTypeSynonyms):

type T k = k Int
type S = T (Compose [] [])

bar :: S -> S
bar = map (map succ)

但请注意,这只是因为在同义词扩展之后我们得到了完全应用的类型 [] ([] Int) (即 [[Int]])。粗略地说,这个功能不允许做任何没有它就可以做的事情,手动扩展同义词。

关于haskell - 像函数一样组合类型构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31018528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com