gpt4 book ai didi

haskell - 为什么 <*> 的 Const 实例接受两个非功能值?

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

(<*>) :: Applicative f => f (a -> b) -> f a -> f b
Const :: a -> Const a b
Monoid m => Applicative (Const * m)

Const "a" <*> Const "b" -- yields Const "ab"
Const a <*> Const a = Const a <> Const a

我想这种行为一定与 Const 是二进制类型构造函数这一事实有关,其中 b 从未被触及(幻像类型)。但是话又说回来,我不明白 Const * m,因为 a(和 * 分别)在这种情况下似乎被丢弃了。

最佳答案

首先如果m有一个 Monoid实例,然后 Const m有一个 Applicative实例。但是Const m仍然是类型构造函数,所以 <*> 的类型对于 Applicative (Const m)阅读

     (<*>) :: Const m (a -> b) -> Const m a -> Const m b  

现在让我们将其应用于 Const "a"Const "b" :

Const "a"类型为 Const String b .所以这里的类型变量 m从上面假定类型 String .关于 b 的值仍然是多态的由于它不包含该类型的具体值,因此该类型仍然可以是任何类型。

在表达式 Const "a" <*> Const "b" 中多态值 Const "a"将被强制为 Const String (a->b) 类型和多态值 Const "b"将被强制为 Const String a 类型.

所以左边确实有一个带有函数类型的类型,只是具体值不包含函数,比如值Nothing类型 Maybe (Int -> Int) .

PS.: 我不知道*在哪里来自 Monoid m => Applicative (Const * m) .如果我输入

    :info Const

在 ghci 中,我明白了

    instance Monoid m => Applicative (Const m)

关于haskell - 为什么 <*> 的 Const 实例接受两个非功能值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44257862/

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