有没有一种语言,即:
1) 功能性
2) 有类型推断
3)有咖喱
4) 并将类型作为一等值
也想从它编译到 JVM 和/或 CLR
F# 是函数式的,并且具有类型推断、柯里化和类型作为一等值,因为您可以通过反射在运行时剖析类型。它编译到 CLR 并且在 Mono 上运行良好。
示例:取自我在F#.NET Journal中的(非免费)文章结构类型:
以下createType
函数创建一个新的 .NET 程序集、新模块和给定名称的新公共类类型:
> let createType typeName =
let name = System.Reflection.AssemblyName(Name="tmpAssembly")
let run = System.Reflection.Emit.AssemblyBuilderAccess.Run
let builder = System.Threading.Thread.GetDomain().DefineDynamicAssembly(name, run)
let mdl = builder.DefineDynamicModule "tmpModule"
let attrs = TypeAttributes.Public ||| TypeAttributes.Class
mdl.DefineType(typeName, attrs);;
val createType : string -> TypeBuilder
我刚开始学习它,但Coq可能对你有用。
很可能有一个函数接受一个类型(是的原始类型,不是该类型的实例)并返回另一种类型(同样,只是类型,而不是实例)。如果您对程序的形式验证完全感兴趣,那么值得一看。
它还有一个小小的好处,就是能够将其代码转换为 Haskell/OCaml/Scheme,这样您就可以使用它们的 IO/Libraries,因为 Coq 往往缺少它们。
它具有类型推断和柯里化,但类型推断并不完美,因为该语言的类型系统远远超出(并且比标准 Milner-Hindley 类型系统更具表现力)。
看看Scala,它适用于 JVM 和 .NET。这里有一些特性,包括你所寻求的 - http://www.scala-lang.org/node/104,查看“Scala is functional”部分、“Local Type Inference”、“Currying”和“Predefined function classOf”文章,它也有顶级类型Any,值和类型的模式匹配,反映包。
首先从维基百科类型的干扰开始。这个问题的答案似乎是 Haskell 或 OCaml。