gpt4 book ai didi

scala - 理解 `Monomorphism` Shapeless的例子

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

Shapeless Features Overview显示以下示例:

import poly._

// choose is a function from Sets to Options with no type specific cases
object choose extends (Set ~> Option) {
def apply[T](s : Set[T]) = s.headOption
}

scala> choose(Set(1, 2, 3))
res0: Option[Int] = Some(1)

scala> choose(Set('a', 'b', 'c'))
res1: Option[Char] = Some(a)

但是,由于缺乏 Shapeless 的经验,我不明白这与以下之间的区别:
scala> def f[T](set: Set[T]): Option[T] = set.headOption
f: [T](set: Set[T])Option[T]

scala> f( Set(1,2,3) )
res0: Option[Int] = Some(1)

scala> f( Set('a', 'b', 'c') )
res1: Option[Char] = Some(a)

最佳答案

这里的重要区别是,choose是一个可以作为值传递的函数。您不能从 f 中得出(合理的)值,因为 Scala 不支持多态函数值:

scala> val fun = f _
fun: Set[Nothing] => Option[Nothing] = <function1>

如您所见,Scala 将元素类型固定为 Nothing使函数对非空集无用:
scala> fun(Set(1))
<console>:10: error: type mismatch;
found : Int(1)
required: Nothing
fun(Set(1))
^

这与您对 Shapeless 方法所期望的一样有效。

关于scala - 理解 `Monomorphism` Shapeless的例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28206295/

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