gpt4 book ai didi

haskell - Haskell 中的部分应用类型

转载 作者:行者123 更新时间:2023-12-02 10:28:31 27 4
gpt4 key购买 nike

基于this问题,在这段代码中

data Promise a b =  Pending (a -> b) | Resolved b | Broken

instance Functor (Promise x) where
fmap f (Pending g) = Pending (f . g)
<小时/>

如果

g :: a -> b

然后

Pending g :: Promise a b

还有

f :: b -> c

因为 f 的存在。 g.

这意味着

Pending (f . g) :: Promise a c`.

总结

fmap :: (b -> c) -> Promise a b -> Promise a c
<小时/>

现在 fmap 独自拥有此签名(适应上述)

fmap :: Functor f => (b -> c) -> f b -> f c

仅当您假设 f = Promise a 时,这才符合。虽然最终产品看起来很合理,但您如何解释 f 的类型或等效地解释部分应用的 Promise Promise a 的类型?

最佳答案

在类型级别,您有另一种编程语言,几乎 - Haskell。特别是,您可以将类型视为具有构造函数并且能够部分应用。

为了更严格地看待这一点,我们引入了“类型的类型”,称为“种类”。例如,类型构造函数 Int 有 kind

Int ::: *

我在其中编写 (:::) 来读取“has kind”,尽管这不是有效的 Haskell 语法。现在我们还有“部分应用类型构造函数”,例如

Maybe ::: * -> *

其函数类型与您在值级别所期望的一样。

<小时/>

关于种类的概念,有一个非常重要的概念——只有当值是种类*时,它们才可以实例化类型。或者,例如,不存在 Maybe

类型的值
x :: Maybe
x = -- .... what!

事实上,在我们期望该类型描述值的任何地方,甚至不可能表达 * 以外的类型。

这导致 Haskell 中“类型级函数”的能力受到某种限制,因为我们不能普遍传递“未应用的类型构造函数”,因为它们并不总是有意义。相反,整个系统的设计使得只能构建合理的类型。

但是允许表达这些“高级类型”的地方是类型类定义。

<小时/>

如果我们启用KindSignatures,那么我们可以直接编写类型的种类。出现这种情况的一个地方是类定义中。这是显示

class Show (a :: *) where
show :: a -> String
...

这是完全自然的,因为 Show 方法的签名中出现的类型 a 是有值的。

但是,当然,正如您在这里所指出的,Functor 是不同的。如果我们写出它的签名,我们就会明白为什么

class Functor (f :: * -> *) where
fmap :: (a -> b) -> f a -> f b

这是一种非常新颖的多态性,更高级的多态性,所以你需要花一分钟才能完全理解它。但需要注意的是,f 仅出现在 Functor 的方法中,应用于其他一些类型a和b。特别是,像这样的类将被拒绝

class Nope (f :: * -> *) where
nope :: f -> String

因为我们告诉系统 f 具有类型 (* -> *) 但我们使用它就好像它可以实例化值一样,就好像它是类型*.

<小时/>

通常,我们不必使用 KindSignatures 因为 Haskell 可以直接推断签名。例如,我们可以(事实上确实如此)编写

class Functor f where
fmap :: (a -> b) -> f a -> f b

并且 Haskell 推断 f 的类型必须是 (* -> *) 因为它似乎应用于 a b. 。同样,如果我们编写不一致的内容,我们可能会失败“种类检查”,就像我们无法通过类型检查一样。例如

class NopeNope f where
fmap :: f -> f a -> a

暗示f有类型*(* -> *),这是不一致的。

关于haskell - Haskell 中的部分应用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23899072/

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