编辑:感谢Derek指出错误消息的关键部分,我能够更多地提取关键部分,它似乎是关于存在类型.如果我在语言参考中正确理解§3.2.10对值的存在量化,那么val m: Map[x.type#S, x.type#S] forSome { val x: T }就是一个简写val m: Map[t#S, t#S] forSome { type t <: T with Singleton }.然而在下面的代码中,它们的行为却有所不同.
trait Type {
type S
}
class Concrete extends Type {
type S = Double
}
trait BaseWorks {
type T <: Type
val m: t#S forSome { type t <: T with Singleton }
}
class Works extends BaseWorks {
override type T = Concrete
override val m = 0.0 …Run Code Online (Sandbox Code Playgroud) scala abstract-data-type existential-type path-dependent-type
我试图将自然数编码为F#中的类型,以便能够在编译时检查相等而不是运行时.我能想到的最好的是
type Nat<'T> =
abstract member AsInt : int
type Z() =
interface Nat<Z> with
member __.AsInt = 0
type S<'P>(prev : Nat<'P>) =
interface Nat<S<'P>> with
member __.AsInt = 1 + prev.AsInt
type TNat =
static member zero = Z() :> Nat<Z>
static member succ (prev : Nat<'P>) = S(prev) :> Nat<S<'P>>
static member one = TNat.succ(TNat.zero)
static member two = TNat.succ(TNat.one)
Run Code Online (Sandbox Code Playgroud)
我不确定我是否对代码感到满意.它能以更好(或更容易)的方式完成吗?
我能确保AsInt在编译时计算出来吗?
我有一台机器上的以下怪异的行为与40芯:调用System.Environment.ProcessorCount在fsi(12.0.30815.0)和fsianycpu(12.0.30815.0)导致不同的结果.
在fsi我进入System.Environment.ProcessorCount = 32fsianycpu我得到System.Environment.ProcessorCount = 40.这似乎也会影响任务并行库,当运行简单的测试代码fsi(处理器数量错误)时,它只使用所有可用内核的80%.
可能是什么原因?