是否有一种语言,即:
1)功能性
2)有类型推断
3)已经讨好了
4)并且类型为第一类值
也想从它编译到JVM和/或CLR
答案 0 :(得分:24)
F#是功能性的,并且具有类型推断,currying和类型作为一流值,因为您可以通过反射在运行时剖析类型。它编译为CLR并在Mono上运行良好。
示例:摘自Structural Typing 中我的(非免费)文章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
答案 1 :(得分:7)
我刚开始学习它,但Coq可能适合你。
很可能有一个函数接受一个类型(是原始类型,而不是该类型的实例)并返回另一个类型(再次,只是类型,而不是实例)。如果您对程序的正式验证感兴趣,那么值得一看。
它还具有将其代码转换为Haskell / OCaml / Scheme的好处,因此您可以使用他们的IO /库,因为Coq往往缺乏它们。
它具有类型推断和currying,但类型推断并不完美,因为语言的类型系统远远超出标准的Milner-Hindley类型系统(并且更具表现力)。
答案 2 :(得分:2)
看看Scala,它适用于JVM和.NET。以下是一些功能,包括您所寻求的内容 - http://www.scala-lang.org/node/104,查看“Scala功能”部分,“本地类型推断”,“Currying”和“Predefined function classOf”文章,它也有顶级类型{{3} },模式匹配值和类型,Any包。
答案 3 :(得分:-1)
首先从wikipedia type interference开始。这个问题的答案似乎是Haskell或OCaml。