gpt4 book ai didi

haskell - 多类组合

转载 作者:行者123 更新时间:2023-12-01 11:24:47 25 4
gpt4 key购买 nike

我有几个类型别名都符合类似的模式:

type Foo f = Bar (Qoox f)
type Faa f = Bar (Qaax f)
type Moo f = Fez (Rxoo f)
type Maa f = Fez (Rxaa f)
-- ...

我想让别名无点,所以我可以自己使用它们。与其定义新类型,我认为如果我可以进行类型级组合,那就太好了:
type Foo = Bar `Compose1` Qoox
type Faa = Bar `Compose1` Qaax
type Moo = Fez `Compose2` Rxoo
type Maa = Fez `Compose2` Rxaa
-- ...

但我一直不得不定义多个 Compose类型,因为基本类型是不同的类型。

我想要的是一个 polykinded 类型级函数
type family (.) (m :: k1 -> k) (n :: k2 -> k1) :: k2 -> k where

所以我可以做
type Foo = Bar . Qoox
type Faa = Bar . Qaax
type Moo = Fez . Rxoo
type Maa = Fez . Rxaa
-- ...

但我怀疑这可能超出了 Haskell 当前的能力,我不想浪费时间尝试实现不可能的事情。

可以使用 GHC8 中可用的扩展在 Haskell 中完成这种组合吗?

最佳答案

我认为 GHC 目前无法使这些毫无意义。

GHCi 8.0 似乎接受了这一点。

> :set -XPolyKinds
> type C (m :: k1 -> k) (n :: k2 -> k1) (t :: k2) = m (n t)
> :i C
type C (m :: k1 -> k) (n :: k2 -> k1) (t :: k2) = m (n t) :: k

但是,请注意,这通常不能部分应用,并且需要您对定义进行 eta-expand。

例如。我们不能使用 type T = C [] []但我们可以使用 type T a = C [] [] a .

如果没有 eta-expansion,我认为我们无法返回类型 k2 -> k除非那是类型构造函数。我们没有类型级别的 lambdas(或部分应用程序)。

关于haskell - 多类组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38461326/

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