Idris 有值类型吗?

Does Idris have value types?

Idris 有值类型吗?

"value type"这个词有点含糊,但我不知道更好的词。

我的意思是:array/struct 结构真的总是 array/struct 指针(如 Java 中那样,与 C# 和 C++ 不同)吗?

由于 Idris 永远不会改变值,所有 类型都是有效的值类型。我敢打赌这就是你想要的答案。

至于事物是否是引擎盖下的指针:我知道有些值不是(Int 是标记值)并且我敢打赌大多数是 C 后端中的指针。这因后端而异。

关于语义

值和引用类型需要区分只是因为变异。但 Idris 是纯函数式的。

关于运行时性能

dotnet 中的

"Value" 类型在 Idris 社区中通常称为 "unboxed"。

AFAIK Idris 尚不支持编码器声明未装箱类型的能力。这可能会随着时间的推移而改变,因为语言设计似乎关心运行时性能。

即使语言不支持显式拆箱,编译器仍然可以做到。例如:如果一个类型的不可变值的运行时表示不大于指针的表示,那么最好不要将它装箱。注意:盒装状态不必由类型决定。可以将一种类型的值拆箱用于一般 [不可变] 用法,并将它的一些可变用法装箱。

与 dotnet 相比,Idris 语言在性能方面也有一些优势:

  • 它没有空值。
  • 它具有唯一性类型[在实验阶段]。

Idris 后端还不成熟,预计它们甚至会错过一些基本的优化。如果您非常关注运行时性能,那么现在采用 Idris 还为时过早 [尽管 Haskell 可能仍然是一个不错的选择]。然而,该语言在设计时就考虑到了性能,我希望它在很长一段时间内都能比 dotnet 具有更好的性能。