小编sas*_*has的帖子

如何使用Scala Cats验证正确的方法?

以下是我的用例

  1. 我正在使用Cats来验证我的配置.我的配置文件在json中.
  2. Config使用lift-json将配置文件反序列化到我的case类,然后使用Cats验证它.我用这个作为指导.
  3. 我使用Cats的动机是收集验证时出现的所有错误.

我的问题是指南中给出的例子,属于类型

case class Person(name: String, age: Int)

def validatePerson(name: String, age: Int): ValidationResult[Person] = {
   (validateName(name),validate(age)).mapN(Person)
}
Run Code Online (Sandbox Code Playgroud)

但在我的情况下,我已经将我的配置反序列化为我的case类(下面是一个示例),然后我将它传递给验证

case class Config(source: List[String], dest: List[String], extra: List[String])

def vaildateConfig(config: Config): ValidationResult[Config] = {
  (validateSource(config.source), validateDestination(config.dest))
   .mapN { case _ => config }
}
Run Code Online (Sandbox Code Playgroud)

这里的区别是mapN { case _ => config }.因为我已经有一个配置,如果一切都有效,我不想从其成员重新创建配置.这是因为我传递配置以验证功能而不是它的成员.

我工作场所的一个人告诉我这不是正确的方法,因为Cats Validated提供了一种构造对象的方法,如果它的成员有效.如果对象的成员无效,则该对象不应存在或不应该是可构造的.这对我来说完全合情合理.

我应该做出任何改变吗?以上我在接受吗?

PS:上面的Config只是一个例子,我的真实配置可以有其他案例类作为其成员,它们本身可以依赖于其他案例类.

validation scala functor scala-cats

11
推荐指数
1
解决办法
601
查看次数

如果使用scala进行版本化配置,如何将解析与验证分开?

背景

我有一组配置JSON文件,如下所示:

{
  "version" : 1.0,
  "startDate": 1548419535,
  "endDate": 1558419535,
  "sourceData" : [...]  // nested json inside the List.
  "destData" : [...]    // nested json inside the List.
  "extra" : ["business_type"]
}
Run Code Online (Sandbox Code Playgroud)

有几个这样的配置文件.它们是固定的,只驻留在我的代码目录中.每个配置文件的内部表示由我的case类给出Config:

case class Attribute(name: String, mappedTo: String)

case class Data(location: String, mappings:List[Attribute])

case class Config(version: Double, startDate: Long, endDate: Long, sourceData: List[Data],
                  destData: List[Data], extra: List[String])
Run Code Online (Sandbox Code Playgroud)

我有三个班Provider,ParserValidator.

  1. Provider有一个方法getConfig(date: Long): Config.它必须返回满足的配置startDate <= date <= endDate(理想情况下,应该存在一个这样的配置,startDate …

validation serialization scala version scala-cats

10
推荐指数
1
解决办法
233
查看次数

为什么play-json在读取/解析时会失去精度?

在以下示例中(scala 2.11和play-json 2.13)

val j ="""{"t":2.2599999999999997868371792719699442386627197265625}"""
println((Json.parse(j) \ "t").as[BigDecimal].compare(BigDecimal("2.2599999999999997868371792719699442386627197265625")))
Run Code Online (Sandbox Code Playgroud)

输出为-1。他们不应该平等吗?在打印解析的值时,它会打印四舍五入的值:

println((Json.parse(j) \ "t").as[BigDecimal])259999999999999786837179271969944

scala playframework play-json

9
推荐指数
1
解决办法
394
查看次数

特性和对象为何以及何时应具有相同的名称?

是什么原因

  trait Dog {
    def bark = "woof"
  }
  object Dog extends Dog
Run Code Online (Sandbox Code Playgroud)

有效,但以下内容不起作用

trait Dog {
  def bark = "woof"
}
class Dog extends Dog
Run Code Online (Sandbox Code Playgroud)

我在某处读到,在上述第一种情况下,该对象不是伴随对象。对象和特征应具有相同的名称时会发生什么情况?

scala traits companion-object

3
推荐指数
1
解决办法
253
查看次数

如何在页面中嵌入代码编辑器?

问题

I want to create a page with a code editor embedded in it.I looked up codemirror
but i am having problems using it as i am new to java script.
Run Code Online (Sandbox Code Playgroud)

所以我正在寻找一种简单的方法将代码编辑器嵌入到页面中(使用java脚本或python).有人请为它提供一些链接/教程或方法.

javascript python

2
推荐指数
3
解决办法
6286
查看次数

在c ++中用类定义一个具有固定大小的向量?

以下是我在C++中的代码部分

class Myclass 
{
    public:
       vector< vector<int> >edg(51); // <--- This line gives error
       // My methods go here
};
Run Code Online (Sandbox Code Playgroud)

注释中标记的行给出了错误:
expected identifier before numeric constant
expected ‘,’ or ‘...’ before numeric constant

但是当我执行以下操作时,它会编译而不会出错

  vector< vector<int> >edg(51); // Declaring globally worked fine
  class Myclass 
  {
    public:
       // My methods go here
  };
Run Code Online (Sandbox Code Playgroud)

我想通了,即使我只是vector < vector<int> >edg在第一种方法中定义它工作正常,所以问题在于常数大小51,我似乎并不理解.我试过谷歌搜索,但由于我的oop的概念很弱,我不太了解,有谁能解释为什么会发生这种情况?

c++ oop

1
推荐指数
2
解决办法
759
查看次数

为什么在构造函数中重写的val为null?

在以下情况下

class A(name:String, job:String) 
{ 
   def profile = name + " " + job 
}

class B(name:String, job:String) 
{ 
  val a = new A(name,job)
  val b = a.profile
}
Run Code Online (Sandbox Code Playgroud)

关于初始化B和覆盖val a

val b = new B("Sasha","Day dream") 
{ override val a = new A("John-Wick","Kill") }
Run Code Online (Sandbox Code Playgroud)

我得到NullPointerExceptionval b = a.profile。我的问题是为什么重写的valnull?做上面的事情是不好的做法吗?

overriding scala nullpointerexception

1
推荐指数
1
解决办法
49
查看次数

C++设置比较慢?

我不得不使用一种数据结构,它将元素保持在某种顺序,以便我可以查询最少元素并有效地插入新元素set ( C++ stl).所以我选择了 .这需要log(n)时间,插入log(n)用于删除至少元件.

所以我写了以下程序:

#include<iostream>
#include<set>
#include<stdio.h>
using namespace std;
int main()
{
   set<int>s1,s2;
   set<int>::iterator it;
   int tmp,i;
   for(i=1;i<=1000000;i++)s1.insert(i);
   for(i=1;i<=1000000;i++)
   {
      it=s1.begin();
      s2.insert(*it);
      s1.erase(s1.begin());
   }
return 0;
}
Run Code Online (Sandbox Code Playgroud)

但这需要1.67我的机器上的秒数(我的核心3)我期望更少,O(log(1000000)*1000000)2*10^7我尝试优先级队列也给了我相同的性能.那么我应该实现自己的以使其更快或有其他方式吗?

c++ data-structures

-4
推荐指数
1
解决办法
295
查看次数