Functional programming 以类型作为一级值的语言?

Functional programming 以类型作为一级值的语言?,functional-programming,Functional Programming,是否有一种语言,即: 1) 功能性 2) 有类型推断 3) 有咖喱 4) 并将类型作为一级值 还希望从它编译到JVM和/或CLR,首先从开始。这个问题的答案似乎是Haskell或OCaml。F#是功能性的,并且具有类型推断、curry和类型作为一级值,从这个意义上讲,您可以通过反射在运行时解析类型。它编译到CLR,在Mono上运行良好 示例:摘自我在中的(非免费)文章: 下面的createType函数创建给定名称的新.NET程序集、新模块和新公共类类型: > let createType

是否有一种语言,即:

1) 功能性

2) 有类型推断

3) 有咖喱

4) 并将类型作为一级值

还希望从它编译到JVM和/或CLR,首先从开始。这个问题的答案似乎是Haskell或OCaml。

F#是功能性的,并且具有类型推断、curry和类型作为一级值,从这个意义上讲,您可以通过反射在运行时解析类型。它编译到CLR,在Mono上运行良好

示例:摘自我在中的(非免费)文章:

下面的
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

我刚开始学,但可能对你有用

很可能有一个函数接收一个类型(是的,是一个原始类型,不是该类型的实例)并返回另一个类型(同样,只是类型,不是实例)。如果您对程序的正式验证感兴趣,那么值得一看

它还有一点好处,那就是能够将其代码转换为Haskell/OCaml/Scheme,这样您就可以使用它们的IO/库,因为Coq往往缺少它们


它有类型推断和咖喱,但类型推断并不完美,因为该语言的类型系统远远超过(并且比)标准的Milner-Hindley类型系统更具表现力。

看看,它在JVM和.NET上都能工作。这里有一些功能,包括您要查找的内容、查看“Scala是功能性的”部分、“本地类型推断”、“Currying”和“预定义的函数类”文章,还有顶级类型、值和类型的模式匹配、包。

Java支持反射,所以……是的,但是它没有类型推断和咖喱。你可以用任何有闭包的语言轻松地咖喱:
curry(f,x)=>((y)=>f(x,y))
(2)和(4)似乎是非常互斥的。是我能想到的最接近的,但不完全匹配。Ocaml没有类型,因为一级值不知道Haskell。@SuzanCioc一级类型可以通过反射处理。这对您来说足够了吗?我可以用反射生成新类型吗?@SuzanCioc尝试查看
反射
包与所询问的反射完全不同。它还具有类型提供程序的思想:有效的编译器扩展,可以在编译时从元数据生成类型。例如,数据库模式或OData服务器查询结果的强类型表示,基于这些服务在代码编译时提供给类型提供程序的元数据。我只想添加@mavnn的注释,即类型提供程序也有助于在F#中编写java脚本,因此,您的F#无处不在,就像node一样,而且还具有类型化多线程语言的所有优点。我可以在运行时使用
F#
生成新类型吗?例如,类型为
A
B
的笛卡尔积?@SuzanCioc是的,您可以使用反射创建新类型。但是,这种类型只能在运行时使用,所以我想不出任何实际应用程序可以这样做。@Jon你能在这里举个例子吗?关于这一点,我的另一个问题是公众不喜欢的:Scala的类型推断很差。例如,函数参数类型是不可推断的,而Scala的早期版本编译为.NET,而当前版本则不可推断。另外,我对您关于函数参数未被推断的评论感到有点困惑。那怎么办?基于函数范围中引用的成员的推理?