检测有向图中所有周期的最有效算法是什么?
我有一个有向图表示需要执行的作业计划,作业是节点,依赖是边缘.我需要检测此图中循环的错误情况,从而导致循环依赖.
您可以在网上找到以下内容:
更高的kinded类型==类型构造函数?
Run Code Online (Sandbox Code Playgroud)class AClass[T]{...} // For example, class List[T]
有人说这是一种更高的kinded类型,因为它抽象了符合定义的类型.
较高的kinded类型是采用其他类型并构造新类型的类型
更高的kinded type == type构造函数,它将类型构造函数作为类型参数?
在更高级别的Generics中,您可以阅读
...抽象类型抽象的类型("更高级的类型")......"
这表明
Run Code Online (Sandbox Code Playgroud)class XClass[M[T]]{...} // or trait YTrait[N[_]]{...} // e.g. trait Functor[F[_]]
是一种更高级的类型.
因此,考虑到这一点,很难区分类型构造函数,更高的kinded类型和类型构造函数,它将类型构造函数作为类型参数,因此上面的问题.
Clojure有多个JSON解析器/编写器库,包括:
每种产品的优缺点是什么,特别是在速度,内存占用和编程方便性方面?还有其他重要因素需要考虑吗?
在演讲和写作中,我一直想要参考monad中的数据,但我不知道该怎么称呼它.
例如,在Scala中,传递给函数的参数flatMap被绑定到......呃...... monad中的那个东西.在:
List(1, 2, 3).flatMap(x => List(x, x))
Run Code Online (Sandbox Code Playgroud)
x 受到限制,我没有一句话.
稍微复杂一点,传递给Kleisli箭头的参数不一定会绑定到monad中的所有数据.与List,Set,Stream,和许多其它的单子,flatMap调用Kleisli箭头很多次,结合x到单子内每次不同片数据.或者甚至不是"数据",只要遵循monad法则.无论它是什么,它都包裹在monad中,并flatMap在没有包装的情况下传递给你,也许一次一件.我只是想知道什么叫做相关的内部monad内容,x至少在某种程度上,所以我可以阻止所有这些愚蠢的语言.
这个东西/数据/价值/东西/无论它是什么标准或传统术语?
如果没有,"糖果"怎么样?
我找不到可下载版本的Clojure参考手册(最好是PDF).有没有人知道我可以下载的地方?
mypy v0.910 拒绝 Python 3.9 中的抽象数据类。这是最小的可重复示例:
from abc import ABC, abstractmethod
from dataclasses import dataclass
@dataclass
class Liquid(ABC):
@abstractmethod
def drip(self) -> None:
pass
Run Code Online (Sandbox Code Playgroud)
这是错误消息:
$ mypy --python-version 3.9 so.py
so.py:4: error: Only concrete class can be given where "Type[Liquid]" is expected
Found 1 error in 1 file (checked 1 source file)
Run Code Online (Sandbox Code Playgroud)
如何让此代码通过mypy?
笔记
我从mypy 问题 #5374中了解到,这是mypy中的一个错误,于 2018 年首次注意到,但仍未得到纠正。不过,我认为人们必须将mypy与抽象数据类一起使用,因此必须有一种解决方法或正确的方法来定义或注释该类。有什么推荐的?
错误消息的基础似乎是mypy假设任何类型的对象都Type可以实例化,但抽象类不能实例化。这似乎是错误,因为Type被定义为表示类对象,而不一定是具体的类对象(即可以实例化的类对象)。
添加# type: ignore到包含的行 …
python abstract-base-class mypy python-dataclasses python-typing
我想在一个特征中扩展一个特征,如下所示:
trait NodeTypes {
trait Node {
def allNodesHaveThis: Int
}
}
trait ScrumptiousTypes extends NodeTypes {
trait Node extends super.Node {
def scrumptiousness: Int
}
}
trait YummyTypes extends NodeTypes {
trait Node extends super.Node {
def yumminess: Int
}
}
object Graph extends NodeTypes with ScrumptiousTypes with YummyTypes {
case class Node() extends super.Node {
override def allNodesHaveThis = 1
override def scrumptiousness = 2 // error: ScrumptiousTypes.Node has been disinherited
override def yumminess = 3
}
} …Run Code Online (Sandbox Code Playgroud) 我想将一个对象传递给一个接受带有投影类型的参数的函数,并让Scala推断出该对象的类型来自包含它的对象.这里有一些简单的代码来说明难度:
trait Cult { cult_ =>
case class CultLeader(personality: Personality) {
val cult = cult_
val follower = personality.attractFollower(this)
}
case class Follower(leader: CultLeader, name: String)
}
trait Personality {
def attractFollower(leader: Cult#CultLeader) =
leader.cult.Follower(leader, "Fred") <-- THIS LINE FAILS TO COMPILE
}
Run Code Online (Sandbox Code Playgroud)
换句话说,CultLeader的Personality应该吸引追随者到与CultLeader相同的邪教.
Scala 2.11.2编译器说:
TypeProjection.scala:11: error: type mismatch;
found : Cult#CultLeader
required: leader.cult.CultLeader
leader.cult.Follower(leader, "Fred")
^
Run Code Online (Sandbox Code Playgroud)
如果我添加一个强制转换,它会正确编译并运行,如下所示:
leader.cult.Follower(leader.asInstanceOf[leader.cult.CultLeader], "Fred")
Run Code Online (Sandbox Code Playgroud)
这似乎很笨拙,它引入了运行时检查,以便在编译时可以推导出来.至少我有一个解决方法.我怎样才能让Scala编译器推断出它leader的类型实际上是leader.cult.CultLeader什么?
我宁愿不cult作为另一个论点传递给attractFollower.在我的实际代码中,这可能会导致很多丑陋的传递cult参数 - 当它真的不需要传递时.
当我使用repl函数时,clojure.main如何从REPL获得类似readline(或类似rlwrap)的功能?
背景这是我在利用和自定义break功能,从喜的Clojure的第一版.我在lein replREPL中使用它.当我的"断点"开始时,Leiningen的REPL的类似readline的功能消失了,这有点不方便.我的肌肉记忆让我↑很快被击中Enter.在我能够阻止自己之前,我已经在我的终端中找到了这个:
debug=> ^[[A
CompilerException java.lang.RuntimeException: Unable to resolve symbol: in this context, compiling:(/tmp/form-init13211381000659590518.clj:1:1)
Run Code Online (Sandbox Code Playgroud)
现在我的REPL卡住了,我必须杀死终端或进程才能离开.如果我能在这个二级REPL中使用readline,或者至少可以防止这个常见问题导致我的调试会话脱轨,我非常喜欢.
该文件说,Set.head返回"第一"项目,并.tail返回"所有,但第一个".*由于Set并没有真正有一个"第一"项目,该文件警告说,如果没有一个有序的类型,你可能会得到不同的结果不同的运行.但你保证尾巴不包括头部吗?
我问的原因是我想知道是否可以这样下去Set:
def recurse(itemsToExamine: Set[Item], acc: Result): Result =
if (itemsToExamine.isEmpty) acc
else {
val item = itemsToExamine.head
recurse(
item.spawnMoreItems ++ itemsToExamine.tail,
acc.updatedFor(item))
}
Run Code Online (Sandbox Code Playgroud)
如果这是合法的,那么为了在每次递归时分离头部和尾部,它肯定比转换Set为Seq和返回更好.