我想实现一个无限的列表:
abstract class MyList[+T]
case object MyNil extends MyList[Nothing]
case class MyNode[T](h:T,t: => MyList[T]) extends MyList[T]
//error: `val' parameters may not be call-by-name
Run Code Online (Sandbox Code Playgroud)
问题是call-by-name
不允许的.
我听说这是因为val
或者var
不允许使用构造函数参数call-by-name
.例如:
class A(val x: =>Int)
//error: `val' parameters may not be call-by-name
Run Code Online (Sandbox Code Playgroud)
但矛盾的是,正常的构造函数的参数仍然是val
,尽管private
.例如:
class A(x: =>Int)
// pass
Run Code Online (Sandbox Code Playgroud)
所以问题是:
val
还是var
?
call-by-name
或val
计算(或初始化)被推迟?根据Erik Osheim的幻灯片,他说继承可以解决与类型类相同的问题,但提到继承有一个问题叫做:
脆弱的遗产噩梦
并说继承是
将多态性与成员类型紧密耦合
他的意思是什么?
在我看来,继承很擅长扩展,要么改变现有类型的实现,要么添加新的成员类型(子类型)到接口.
trait Foo { def foo }
class A1 extends Foo{
override def foo: Unit = ???
}
//change the foo implementation of the existing A1
class A2 extends A1 with Foo{
override def foo = ???
}
// add new type B1 to Fooable family
class Bb extends Foo{
override def foo = ???
}
Run Code Online (Sandbox Code Playgroud)
现在就类型类而言:
trait Fooable[T] { … }
def foo[T:Fooable](t:T) = …
class Aa {…}
class Bb {…} …
Run Code Online (Sandbox Code Playgroud) 我所知道
的 Python 数据类允许使用数据类或类进行继承。在最佳实践中(以及在其他语言中),当我们进行继承时,应该首先调用初始化。在 Python 中它是:
def __init__(self):
super().__init__()
...
Run Code Online (Sandbox Code Playgroud)
我在做什么
因为数据类是在 Python 3.7 中引入的,所以我正在考虑用数据类替换我的所有类。使用 dataclass,它的好处之一是__init__
为您生成。当数据类需要继承基类时,这并不好——例如:
class Base:
def __init__(self):
self.a = 1
@dataclass
class Child(Base):
a:int
def __post_init__(self):
super().__init__()
Run Code Online (Sandbox Code Playgroud)
我的问题
问题是我们必须将超级初始化调用放入__post_init__
其中,实际上是在dataclass 的init之后调用的。
缺点是我们失去了约定契约,初始化混乱导致我们无法覆盖超类的属性。
可以通过 的概念解决__pre_init__
。我已经阅读了该文档,但没有看到与该概念有任何关系。我错过了什么吗?
什么构成纯函数式编程的价值?
看到一句话后我问自己这些问题:
Task
(或IO
)有一个构造函数,可以将副作用捕获为值.
assert(f == g)
.对于两个相同但单独定义的函数=> f != g
,为什么它们不起作用1 == 1
?IO { println("") }
) 我们如何测试某些东西是否有价值?不变性是一个充分条件吗?
更新:我正在使用Scala.
这只是scikit-learn管道的一个小问题.
在课堂上sklearn.pipeline.FeatureUnion
,有一个transformer_weights
选项.
transformer_weights:dict,optional
:每个变压器的特征的乘法权重.键是变换器名称,值是权重.
我在一个例子中看到了对不同特征赋予不同权重的用法.
transformer_weights={
'subject': 0.8,
'body_bow': 0.5,
'body_stats': 1.0,
},
Run Code Online (Sandbox Code Playgroud)
这对我来说是无稽之谈,因为分类器将在以后为你学习加权.为什么还要费心呢?
我已经使用多个线程很长时间了,但无法解释这种简单的情况。
import java.util.concurrent.Executors
import scala.concurrent._
implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(1))
def addOne(x: Int) = Future(x + 1)
def addTwo(x: Int) = Future {addOne(x + 1)}
addTwo(1)
// res5: Future[Future[Int]] = Future(Success(Future(Success(3))))
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,它有效。而且我不知道为什么。
问题:
为什么给定一个线程可以同时执行两个Future?
我的期望:
第一个Future
(addTwo
)占用一个唯一的线程(newFixedThreadPool(1)
),然后调用另一个Future
(addOne
),这又需要另一个线程。
因此,程序最终将因线程不足而陷入困境。
我_
用作占位符来创建匿名函数,问题是我无法预测Scala将如何转换我的代码.更确切地说,它错误地确定了我想要的"大"匿名函数的大小.
List(1,2,3) foreach println(_:Int) //error !
List(1,2,3) foreach (println(_:Int)) //work
List(1,2,3) foreach(println(_:Int)) //work
Run Code Online (Sandbox Code Playgroud)
使用-Xprint:typer
我可以看到Scala将第一个转换为"一个大的匿名函数":
x$1 => List(1,2,3) foreach(println(x$1:Int))
Run Code Online (Sandbox Code Playgroud)
工作的第2个3号是正确的转变成我想要的.
... foreach (x$1 => println(x$1:Int))
Run Code Online (Sandbox Code Playgroud)
为什么这个?规则是什么?
lambda scala anonymous-function partial-application scala-placeholder-syntax
这个简化的案例是我的问题发生在...
object Main extends IOApp{
def run(args:Seq[String]): IO[ExitCode]={
Task{...}
.to[IO]
.as(ExitCode.Success)
}
}
Run Code Online (Sandbox Code Playgroud)
另一种选择是Await.result(task)
,但是这听起来不太符合IOApp
的做法。
根据这个伟大的帖子Monix vs Cats Effect
我看到之间Task
IO
的差异是:
Task
API比 IO
Task
在线程调度公平性方面更加智能和自动化Task
获得更多可取消选项转换Monix
Task
成后我失去了什么Casts
IO
?
它似乎可以正常工作,Task.gather
并且timeout
- 所有这些任务特定的东西。
那么我在转换中失去了什么?
如果不是,则没有理由创建一种以上的数据类型。
所以给出的差异是这意味着我失去了调度的公平性交谈后Task
到IO
?
好吧,我应该自己验证一下,但我不知道如何测试它的公平性。
multithreading functional-programming scala scala-cats monix
我有实现MyInterface的枚举.在使用该枚举创建其他类时,我想将enumClz约束为已实现MyInterface的类.
所以我T extends Enum< T extends MyInterface>
在一般类型声明中描述签名是" ".
public <T extends Enum< T extends MyInterface>> C1( Class<T> enumClz) {
for (T anEnumConst : enumClz.getEnumConstants()) {
//....process
}
}
Run Code Online (Sandbox Code Playgroud)
让我感到惊讶的是IDE说它在" T extends MyInterface
" 意外受到限制.我不知道这两个字的错误信息意味着什么,有什么解决方案吗?
顺便说一句,出于好奇,我有一个奇怪的问题,虽然不是很重要.枚举类型T可以等效于以下无限循环
<T extends Enum< T extends Enum<T extends<....>>>>
?
我使用sbt来构建一个play-scala-seed项目,并添加一个简单的:
<button id="doclick" onclick="doConsole();">click</button>
Run Code Online (Sandbox Code Playgroud)
但是当我启动项目并单击按钮时.控制台提供错误输出:
localhost /:17拒绝执行内联事件处理程序,因为它违反了以下内容安全策略指令:"default-src*".要么是'unsafe-inline'关键字,哈希('sha256 -...'),要么是nonce('nonce -...')来启用内联执行.另请注意,'script-src'未显式设置,因此'default-src'用作后备.
application.conf
play.http.filters = "filter.Filters"
play.filters.headers.contentSecurityPolicy="script-src 'self' 'unsafe-inline'"
Run Code Online (Sandbox Code Playgroud)
只需按照官方doc play-securityheaders
我错过了什么或得到错误的路径导致仍然无法调用内联脚本?
scala ×6
inheritance ×2
python ×2
callbyname ×1
concurrency ×1
enums ×1
generics ×1
haskell ×1
java ×1
lambda ×1
monix ×1
python-2.7 ×1
scala-cats ×1
scikit-learn ×1
terminology ×1
typeclass ×1