在Scalaz中使用自定义半组类时遇到麻烦

恢复莫妮卡

scalaz.std.MapInstances声明任何值为a的映射Semigroup本身就是a Monoid由于IntSemigroup,下面的代码工作:

def merge[K](maps : Iterator[Map[K, Int]]) : Map[K, Int] = maps.reduce(_ |+| _)

但是,令我惊讶的是以下代码不起作用:

class Num(value : Int) extends Semigroup[Num] {
    def append(x : Num, y : Num): Num = new Num(x.value + y.value)
}

def merge[K](maps : Iterator[Map[K, Num]]) : Map[K, Num] = maps.reduce(_ |+| _)

谁能向我解释为什么不将其值为我的自定义Semigroup的映射视为Monoids?

特拉维斯·布朗

Semigroup是一个类型类,这意味着在表示您的数据的类中扩展它不是预期的用法。

如果你熟悉Java,认为之间的差异ComparableComparator如果Num要用Java实现,并且希望支持比较Num值,则可以使用您的Num类实现Comparable[Num],也可以提供一个类型值Comparator[Num]来描述如何比较两个Num实例。

Semigroup就像Comparator,而不是Comparable—您不需要扩展它,而是提供一个描述如何附加类型实例的值。请注意,在您的版本中,value实例参数未在实现中使用append

import scalaz.Semigroup

class Num(value: Int) extends Semigroup[Num] {
  def append(x: Num, y: Num): Num = new Num(x.value + y.value)
}

相反,您将编写如下内容:

import scalaz.Semigroup

class Num(val value: Int)

object Num {
  implicit val numSemigroup: Semigroup[Num] =
    Semigroup.instance((a, b) => new Num(a.value + b.value))
}

接着:

scala> def merge[K](maps: List[Map[K, Num]]): Map[K, Num] = maps.reduce(_ |+| _)
merge: [K](maps: List[Map[K,Num]])Map[K,Num]

scala> val merged = merge(List(Map("a" -> new Num(1)), Map("a" -> new Num(2))))
merged: Map[String,Num] = Map(foo -> Num@51fea105)

scala> merged("a").value
res5: Int = 3

通过将类型的隐含价值Semigroup[Num]Num的同伴对象,我们说,这是我们希望使用我们需要加在一起的任何时间的操作Num实例。

使用这种模式,而不是继承具有类似于的优点在于优势Comparator拥有Comparable在Java中:您可以将数据类型定义所有你可能需要对数据进行操作的定义分开,你可以有多个实例,等等。 Scala允许您将类型类的实例放到隐式范围内,从而使这些优势更进一步,从而使您不必手动传递它们(尽管您仍然可以这样做)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Django中使用自定义http标题遇到麻烦

来自分类Dev

Scala结合地图,同时使用Scalaz半组处理自定义类型的碰撞

来自分类Dev

使用自定义tensorflow gpu op进行编译时遇到麻烦

来自分类Dev

使用自定义HTML Helper,CSS和数据属性时遇到麻烦

来自分类Dev

使用自定义IP地址在`iptables'中设置正确的转发规则以进行网络共享时遇到麻烦

来自分类Dev

在自定义类中使用QHash

来自分类Dev

自定义类型类的类型麻烦

来自分类Dev

在为TreeSet实施自定义比较器时遇到麻烦(Dijkstra的)

来自分类Dev

在Sklearn管道中使用ColumnTransformer()时发生ValueError-对GloveVectorizer使用Spacy的自定义类

来自分类Dev

在函数中使用pygame.sprite类的属性时遇到麻烦

来自分类Dev

在AWS Lambda中使用自定义类时的JSON解析错误

来自分类Dev

在自定义类中使用train_test_split时发生Typerror(单列数组...)

来自分类Dev

在AWS Lambda中使用自定义类时的JSON解析错误

来自分类Dev

在WPF中使用自定义Application类时,StartupUri为null

来自分类Dev

使用自定义组计算MySQL计数时

来自分类Dev

使用自定义类时找不到类

来自分类Dev

在我的主要CSS中使用我的自定义CSS有点麻烦了。(WordPress)

来自分类Dev

在FxCop自定义规则中使用SerializationAttribute检测类

来自分类Dev

在Laravel 5中使用自定义类

来自分类Dev

如何在动态编译中使用自定义类

来自分类Dev

在自定义容器类中使用分配器

来自分类Dev

在Simple Injector中使用自定义参数解析类

来自分类Dev

在Android的HashMap中使用自定义类

来自分类Dev

如何在自定义类中使用Dask

来自分类Dev

在ViewPager中使用自定义视图类

来自分类Dev

在自定义jQuery类中使用keyup函数

来自分类Dev

在自定义容器类中使用分配器

来自分类Dev

在Android的HashMap中使用自定义类

来自分类Dev

在自定义适配器类中使用OnclickListener

Related 相关文章

  1. 1

    在Django中使用自定义http标题遇到麻烦

  2. 2

    Scala结合地图,同时使用Scalaz半组处理自定义类型的碰撞

  3. 3

    使用自定义tensorflow gpu op进行编译时遇到麻烦

  4. 4

    使用自定义HTML Helper,CSS和数据属性时遇到麻烦

  5. 5

    使用自定义IP地址在`iptables'中设置正确的转发规则以进行网络共享时遇到麻烦

  6. 6

    在自定义类中使用QHash

  7. 7

    自定义类型类的类型麻烦

  8. 8

    在为TreeSet实施自定义比较器时遇到麻烦(Dijkstra的)

  9. 9

    在Sklearn管道中使用ColumnTransformer()时发生ValueError-对GloveVectorizer使用Spacy的自定义类

  10. 10

    在函数中使用pygame.sprite类的属性时遇到麻烦

  11. 11

    在AWS Lambda中使用自定义类时的JSON解析错误

  12. 12

    在自定义类中使用train_test_split时发生Typerror(单列数组...)

  13. 13

    在AWS Lambda中使用自定义类时的JSON解析错误

  14. 14

    在WPF中使用自定义Application类时,StartupUri为null

  15. 15

    使用自定义组计算MySQL计数时

  16. 16

    使用自定义类时找不到类

  17. 17

    在我的主要CSS中使用我的自定义CSS有点麻烦了。(WordPress)

  18. 18

    在FxCop自定义规则中使用SerializationAttribute检测类

  19. 19

    在Laravel 5中使用自定义类

  20. 20

    如何在动态编译中使用自定义类

  21. 21

    在自定义容器类中使用分配器

  22. 22

    在Simple Injector中使用自定义参数解析类

  23. 23

    在Android的HashMap中使用自定义类

  24. 24

    如何在自定义类中使用Dask

  25. 25

    在ViewPager中使用自定义视图类

  26. 26

    在自定义jQuery类中使用keyup函数

  27. 27

    在自定义容器类中使用分配器

  28. 28

    在Android的HashMap中使用自定义类

  29. 29

    在自定义适配器类中使用OnclickListener

热门标签

归档