类型为一等值的语言?

时间:2013-01-25 09:50:33

标签: functional-programming

是否有一种语言,即:

1)功能性

2)有类型推断

3)已经讨好了

4)并且类型为第一类值

也想从它编译到JVM和/或CLR

4 个答案:

答案 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。