gpt4 book ai didi

scala - Scala 中的类型别名

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

阅读 Functional Programming in Scala ,我看到了以下类型别名:

type Const[M, B] = M

implicit def monoidApplicative[M](M: Monoid[M]) =
new Applicative[({ type f[x] = Const[M, x] })#f] {
def unit[A](a: => A): M = M.zero
def map2[A,B,C](m1: M, m2: M)(f: (A,B) => C): M = M.op(m1,m2)
}

这里的 Const[M, x] 作为类型别名是什么意思?我的理解是,对于正在创建的新 Applicative,它有一个 [M, B] 类型,其中 B 在函数中指定水平。

最佳答案

我不确定为什么要引入这种类型别名——有充分的理由回到那本书! :)

不过,意思很简单。 Const 是具有两个类型参数的东西,其中第二个类型参数无关紧要。我希望它用在期望具有两个类型参数的类型构造函数的地方,但碰巧不是。

表达式 ({ type f[x] = Const[M, x] })#f 被称为 type lambda,它在这里使用 (事实上,在大多数地方)将带有两个类型参数的东西 Const 转换为带有一个类型参数的东西!

现在,有趣的是接收到的类型参数由于其在 Const 中的位置而被忽略,取而代之的是 M,这是一个类型参数使用 monoidApplicative 定义。

请注意,Applicative 需要接受类型参数的东西,这里我们使用 M,其中 Monoid[M] 存在。 M 的两个示例是 IntString,它们都没有类型参数。

所以,从某种意义上说,我们通过一个技巧来欺骗 Applicative,其中类型参数被忽略,最终类型被你想要的任何东西替换,所以你可以有一个 Applicative[ Int],可以这么说,尽管 Int 没有类型参数。

关于scala - Scala 中的类型别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21396626/

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