Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 具有函数式编程的链接对象?_Design Patterns_Scala - Fatal编程技术网

Design patterns 具有函数式编程的链接对象?

Design patterns 具有函数式编程的链接对象?,design-patterns,scala,Design Patterns,Scala,我是Scala的新手,但我是一名经验丰富的程序员,正在努力摆脱旧习惯,开始使用函数式风格。我正在设计的一个简单的程序包含了问题/答案对象,并保留了一些关于成功的基本事实。仅使用不可变对象就很容易做到这一点,但我的部分目标是将相关事实联系起来,这样程序可能会时不时地在彼此旁边询问它们。示例:骑士车是,什么电视节目以黑斑羚为主角 在Java中,我可能只是像下面所写的那样链接了相关的对象,但不可更改的规则阻止了这一点,我不能链接A->B并实例化B->A,除非我一次完成 我必须承认,这可能是一件好事——

我是Scala的新手,但我是一名经验丰富的程序员,正在努力摆脱旧习惯,开始使用函数式风格。我正在设计的一个简单的程序包含了问题/答案对象,并保留了一些关于成功的基本事实。仅使用不可变对象就很容易做到这一点,但我的部分目标是将相关事实联系起来,这样程序可能会时不时地在彼此旁边询问它们。示例:骑士车是,什么电视节目以黑斑羚为主角

在Java中,我可能只是像下面所写的那样链接了相关的对象,但不可更改的规则阻止了这一点,我不能链接A->B并实例化B->A,除非我一次完成

我必须承认,这可能是一件好事——也许函数式风格是为了防止这种循环引用而设计的。但我不知道如何纠正这个问题。我的设计会失败,一旦一个问题被问到-这将返回一个副本对象与新的价值观的权利,所以问对象链接似乎又是一个陷阱。我的最佳猜测是仅基于Q/a数据在助手对象中构建关系集,但我希望避免处理单独的数据模式对象

谢谢大家-俄亥俄州哥伦布市的蒂姆

case class FactItem (

    q:String, a:String,
    right: Double = 0.0,
    asked: Double = 0.0,
    linked: List[FactItem] = List[FactItem]()

    ) { 

  def rP = right / asked //right per

  def subLink( l:List[FactItem] ) : FactItem =  {
    this.copy( linked = l-this)

  } 

请参阅此问题,了解如何永久执行此操作:

提示:不要在case类中执行此操作,除非您重写toString以不包括项目列表,否则如果存在循环引用,您将溢出堆栈,因为此项目的toString包括列表中所有其他项目的toString

一旦有了对列表项的引用,您可以将列表设置为私有变量,并从创建所有项的伴随对象中的factory方法更新所有实例,从而省去了很多麻烦。由于没有公共设定者,它实际上仍然是不变的


一种类似的、理论上可能更合理的方法是将列表设置为一个流,该流从伴生对象中的映射获取其值。创建项目时,映射必须是可变的,但至少项目现在是完全不可变的。

有关如何不可变地执行此操作,请参见此问题:

提示:不要在case类中执行此操作,除非您重写toString以不包括项目列表,否则如果存在循环引用,您将溢出堆栈,因为此项目的toString包括列表中所有其他项目的toString

一旦有了对列表项的引用,您可以将列表设置为私有变量,并从创建所有项的伴随对象中的factory方法更新所有实例,从而省去了很多麻烦。由于没有公共设定者,它实际上仍然是不变的


一种类似的、理论上可能更合理的方法是将列表设置为一个流,该流从伴生对象中的映射获取其值。在创建项目时,映射必须是可变的,但至少项目现在是完全不可变的。

真正的答案是不要这样做。创建指向两者的关系对象

现在你可能想知道如何从一个指向关系的对象到关系本身,再到另一个对象,你可以使用拉链来实现这一点。不直接转到对象a,而是获得树/图形,并将拉链移动到a。从那里,你可以回到关系,向前到b,或者直接从a到b,如果拉链知道横向运动

不幸的是,Scala在实用拉链方面远远落后于Haskell。但是,如果您理解我将留给您研究的概念,那么您总是可以为您的数据结构创建一个

还有另一个答案可能适用。你可能有一个镜头,它是一个知道如何把其他物体分开并组合在一起的物体。类的基本设计必须考虑到它的易变性或惰性技巧,但是镜头除了提供一些其他漂亮的特性外,还隐藏了操作本身的丑陋


最后,我想强调的是Scala并不是纯粹的函数式语言,这是有充分理由的:Odersky认为纯函数式语言之外还有价值,并希望您拥有这种功能

真正的答案是不要那样做。创建指向两者的关系对象

现在你可能想知道如何从一个指向关系的对象到关系本身,再到另一个对象,你可以使用拉链来实现这一点。不直接转到对象a,而是获得树/图形,并将拉链移动到a。从那里,你可以回到关系,向前到b,或者直接从a到b,如果拉链知道横向运动

不幸的是,Scala在实用拉链方面远远落后于Haskell。但是,如果您理解我将留给您研究的概念,那么您总是可以为您的数据结构创建一个

还有另一个答案可能适用。你可能有一个镜头,这个镜头是一个知道如何把它拆开和组装在一起的物体 修改后的其他对象。类的基本设计必须考虑到它的易变性或惰性技巧,但是镜头除了提供一些其他漂亮的特性外,还隐藏了操作本身的丑陋


最后,我想强调的是Scala并不是纯粹的函数式语言,这是有充分理由的:Odersky认为纯函数式语言之外还有价值,并希望您拥有这种功能

嘿,我也是都柏林人!但说真的,我不认为把这些信息放在你的用户名里是一个特别好的主意。你可以而且应该。。。如果您想让人们回答您的问题,请使用代码块,在每行代码前放置4个空格:。这是可以做到的,在FP世界中,这被称为打结。然而,我不知道如何在Scala中做到这一点,所以我重新问了一个简化版的问题:嘿,我也是都柏林人!但说真的,我不认为把这些信息放在你的用户名里是一个特别好的主意。你可以而且应该。。。如果您想让人们回答您的问题,请使用代码块,在每行代码前放置4个空格:。这是可以做到的,在FP世界中,这被称为打结。然而,我不知道如何在Scala中做到这一点,所以我重新问了你一个简化的问题:谢谢你,Luigi,这帮了我很大的忙,同时也回答了当我注意到Scala在case类上递归执行ToString时我的一个恐惧!感谢Luigi,这帮了我很大的忙,同时也回答了当我注意到Scala递归地执行case类上的ToString时我的一个担忧!