我对Scala编程语言很陌生,在我在这里讲课时,正在尝试一些困扰我的想法.
我想我无法理解cons运算符是如何工作的,这里有一些我尝试过的东西:
我创建了一个伪随机数生成器,然后尝试创建一个随机值的列表:
scala> val gen = new java.util.Random
gen: java.util.Random = java.util.Random@1b27332
scala> gen nextInt 3 :: Nil
<console>:7: error: type mismatch;
found : List[Int]
required: Int
gen nextInt 3 :: Nil
^
Run Code Online (Sandbox Code Playgroud)
但它试图将List(3)传递给nextnt方法.当我使用paratheses时,没有问题
scala> (gen nextInt 3) :: Nil
res69: List[Int] = List(1)
Run Code Online (Sandbox Code Playgroud)
我对执行顺序感到好奇,所以我创建了一个检查它的函数
scala> def pr(i:Int):Int = { println(i); i }
pr: (i: Int)Int
scala> pr(1) :: pr(2) :: pr(3) :: Nil
1
2
3
res71: List[Int] = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
如输出中所示,执行顺序与外观顺序相同.然后我认为它可能是关于'nextInt'功能,然后我尝试了以下:
scala> 1 + …
Run Code Online (Sandbox Code Playgroud) 我最近了解了函数式编程(在Haskell和Scala中).它的功能和优雅非常迷人.
但是当我遇到使用名为Monoid的代数结构的Monads时,我很惊讶并且很高兴看到我从数学中学到的理论知识在编程中得到了应用.
这个观察带来了一个问题:组,字段或环(参见其他代数结构)是否可以用于编程,以实现更多的抽象和代码重用目的,并实现类似数学的编程?
据我所知,名为Fortress的语言(在编译器完成后我肯定会喜欢任何语言)在其库代码中定义了这些结构.但到目前为止我只看到数字类型,我们已经熟悉了.它们还有其他用途吗?
最好的问候,ciun
functional-programming fortress algebraic-data-types abstract-algebra
以下代码摘自Martin Odersky等人的Scala编程书.它定义了一个理性类型:
class Rational(n: Int, d: Int) {
require(d != 0)
private val g = gcd(n.abs, d.abs)
val numer = n / g
val denom = d / g
...
private def gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b)
}
Run Code Online (Sandbox Code Playgroud)
这里值g仅在隐式构造函数初始化字段numer和denom时使用.假设程序员知道它不会在其他任何地方使用.在上面的例子中,它在构造Rational对象后仍然可以访问.这意味着它也将占用空间,因为它是一个私有字段,而不是构造函数的局部变量.
我的问题是如何更改此代码,以便g
仅在构造时使用然后丢弃?
我们在AWS上有一个EC2实例,我们将后端服务部署到.我们首先使用Google Spreadsheets(使用Google Apps脚本编写脚本)通过部署在我们服务器上的Web服务来展示我们的后端.我们有一个特定的端口,https(使用自签名证书)协议用于为飞行时加密的Web服务提供服务.我们已经设置了安全组(基本上是防火墙条目组),其中包括我们的Web服务的特定入口端口的以下CIDR范围:
64.18.0.0/20
64.233.160.0/19
66.102.0.0/20
66.249.80.0/20
72.14.192.0/18
74.125.0.0/16
173.194.0.0/16
207.126.144.0/20
209.85.128.0/17
216.58.192.0/19
216.239.32.0/19
Run Code Online (Sandbox Code Playgroud)
如https://developers.google.com/apps-script/guides/jdbc#setup_for_google_cloud_sql中所述
这个设置工作正常,直到5天前.然后发生了一些奇怪的事.当我们从"脚本编辑器"运行电子表格后面的脚本时,代码运行正常,并且对我们的webservice的请求成功返回.但是当通过菜单项调用完全相同的代码时,它没有做任何事情.经过长期令人沮丧的调查后,我们发现请求甚至没有到达我们的服务器(还有许多其他古怪的症状,例如只有上一个日志命令在"执行记录"中可见,即使应该有很多其他人).然后我们尝试用从任何ip接受的规则替换安全组但是到特定端口一切都正常工作.
以下是google-apps-script-issues页面中看似相关问题的链接:https: //code.google.com/p/google-apps-script-issues/issues/detail?id = 4697#c8
我们运行tcpdump tcp port <port> -i eth0 -vv
并观察到,当我们从"脚本编辑器"运行代码时,请求来自66.102.7.156
(以及来自类似的ips 66.102.0.0/20
),当从电子表格中的菜单项调用代码时,请求来自72.14.199.55
(以及来自类似的ips,哪些是72.14.192.0/18
).这个似乎是有问题的IP范围.
我的问题是,为什么当请求源被正确地包含在防火墙规则中时,一个ips块不起作用并且当端口上的ip限制解除时开始工作(源IP 0.0.0.0/0
)?它是AWS中安全组的错误吗?或者我们做错了什么?此外,如果我们的方法在任何方面都不充分,那么我们将非常感谢其他解决方案或建议.
由于问题的标题状态,并访问type
A的lazy val
成员造成该成员的评价?或者它只是使用其静态类型?
这里是其中我有一个示例代码implicit lazy val
,我想用它的在该方法中类型的接受implicit val
与该类型:
implicit lazy val nonSpaces: Array[(Point, Part)]
...
def randomNonSpaceCoordinate(implicit nonSpaces: this.nonSpaces.type): Point = nonSpaces(Utils.Random.randUpTo(nonSpaces.length))._1
为了创建类似表的结构,我在以前的应用程序中以以下格式序列化了行数据:
{ "key1": "...", "key2": "...", "15/04": 1.3, "15/05": 1.2, .... "17/08": 0.8 }
Run Code Online (Sandbox Code Playgroud)
现在,我试图用Go重写它,以便通过动手学习语言。在Go中,可以将两个结构嵌入到另一个结构中,从而将它们组合在一起。从该结构中封送的json将具有平面结构,即,生成的json对象将具有第一和第二个结构的字段的并集,而不会嵌套。这是一个示例:https : //play.golang.org/p/jbJykip7pw(来自http://attilaolah.eu/2014/09/10/json-and-struct-composition-in-go/)
我猜想我也可以将地图嵌入结构中,以便可以使用以下类型定义在json上进行编组:
type Row struct {
key1 string
key2 string
RowData
}
type RowData map[string]float64
...
func main() {
row := Row{
"...",
"...",
RowData{
"15/04": 1.3, "15/05": 1.2, .... "17/08": 0.8,
},
}
}
Run Code Online (Sandbox Code Playgroud)
但这在我的“行”对象中创建了一个字段“行数据”字段,而不是将行数据中的条目追加到所需的平面json对象中:
{ "key1": "...", "key2": "...", "RowData": { "15/04": 1.3, "15/05": 1.2, .... "17/08": 0.8 } }
Run Code Online (Sandbox Code Playgroud)
我想知道,是否有一种方法可以将地图或切片嵌入到结构中,以使生成的json对象是平坦的,而无需MarshalJSON
在type上定义函数Row
?
scala ×3
amazon-ec2 ×1
composition ×1
cons ×1
constructor ×1
dictionary ×1
fortress ×1
go ×1
json ×1
list ×1
security ×1
struct ×1
types ×1