问题标签 [parametric-polymorphism]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - 在 Scala 中,我可以动态指定参数类型的类型参数吗?
我正在编写一个程序,其中用户在命令行上指定类的路径。我通过以下方式将它变成一个Class
对象:
我有一个MyParametric[T]
带有单个类型参数的参数类。然后我想做另一种 Class
类型Class[ParamatricType[clazz]
,这样我就可以将它传递给一个方法,例如我想做类似的事情
但这是不允许的。如何使用动态给出的类型参数来实例化参数类型?
agda - Agda 中的参数利用证明
阅读这个答案促使我尝试构建并证明多态容器函数的规范形式。结构很简单,但证明让我难过。下面是我尝试编写证明的简化版本。
简化版本证明,由于参数性,足够多态的函数不能仅根据参数的选择来改变它们的行为。假设我们有两个参数的函数,一个是固定类型,一个是参数:
我想证明的属性:
Agda 内部可以证明这样的陈述吗?
java - Java中的多态值
我正在研究 Haskell 并遇到了polymorphic values。这些是根据上下文具有不同类型的值。例如,Nothing
有类型Maybe a
或[]
有类型[a]
。[]
你想要的任何东西的列表也是如此,你可以在任何需要列表的地方使用它。
我很难在 Java 中找到类似的东西,除了“十亿美元的错误” null
,它基本上是任何类型的。可能与无界通配符的泛型类似,但同样,我想不出一个例子。
Java中有类似的东西吗?
functional-programming - fn 类型的 ml 函数:'a -> 'b
功能:
现在,有没有可以定义并具有这种类型的函数?
haskell - 将作为参数传递的函数应用于 Haskell 中的不同类型
有没有办法将作为参数传递的函数应用于两种不同的类型?作为一个人为的例子,我可以(Maybe Int, Maybe Bool)
使用表达式创建一个(Just 3, Just True)
,但是如果我尝试使用该函数使这种行为更通用
这样我就可以做类似generic Just
的事情,编译器会抱怨,因为类型变量a
是常量。
其用例是将通用函数应用于树结构,其中每个节点都由类型参数化。
haskell - 我可以在 Haskell 中的类型/数据构造函数上约束参数多态类型吗?
我有一个参数化类型,我想将其限制为数字类型,更具体地说是 a Fractional
,例如:
这样 API 的用户可以定义他们可能使用的非整数类型(Float
或Double
?),但我编写的内部 API 代码仍然可以对数字类型执行算术运算。我不希望它是整数,因为我的“内部操作”的结果可能不是整数,我的理解是使用Fractional
会导致更准确的结果。
编译上述(至少在 GHCI 中)会给我以下错误:
这表明我正在做一些我可能不想继续尝试的事情;即我的设计是垃圾。
我想我想在这个 API 中说以下内容:“当您使用 Rating 类型时,它的参数必须是的子类,Fractional
以便我可以对其执行准确的算术运算”。我怎样才能做到这一点?还是我离题和/或过度设计?
c++ - 为什么说 C++ 不支持参数多态?
根据参数多态性的维基百科页面:
类型多态性的一些实现表面上类似于参数多态性,同时也引入了特殊方面。一个例子是 C++ 模板特化。
问题:为什么说 C++ 只实现与参数化多态性表面上相似的东西?特别是,模板不是参数多态性的一个例子吗?
haskell - 在 Haskell 中,“高级类型”*真的*类型吗?或者它们仅仅表示*具体*类型的集合,仅此而已?
参数化多态函数
考虑以下函数:
我们可以说f
is的类型a -> Int
,f
因此它是“多态”类型。
以下哪项是最准确的思考方式f
?
实际上有一个
f
typea -> Int
。但是,它可以用作 、f :: Int -> Int
等f :: Double -> Int
。从字面上看,类型
f
是 NOTa -> Int
。实际上,这只是一种简写方式,即存在一个类型为具体的函数族f
(即,有 anf :: Int -> Int
、anf :: Double -> Double
等;此外,这些函数中的每一个都彼此不同)。
高等类型
同样,我们可以考虑以下类型声明:
并问两种观点哪个更正确:
没有单一类型
Maybe
;实际上,只有一个具体类型的族(Maybe Int
、Maybe String
等),仅此而已。实际上只有一种类型
Maybe
。这种类型是更高种类的类型。当我们说它是“类型”时,我们的意思是字面意思(不是 (1) 的简写)。碰巧我们也可以编写Maybe Int
,Maybe Double
等来生成不同的类型(它们恰好是具体的)。但是,归根结底(即):Maybe
、Maybe Int
和Maybe String
表示三种不同的类型,其中两种是具体的,另一种是高级的。
问题摘要
在 Haskell 中,“高级类型”真的是类型吗?或者只是具体类型是“真正的类型”,当我们谈到“高级类型”时,我们只是表示一个具体类型的族。此外,参数化多态函数是表示单一类型的函数,还是仅表示具体类型的集合函数(仅此而已)?
java - Java ClassCastException 从通用实例“new ClazzXXX”中获取 ParameterizedType E()"
下面我粘贴了我想运行的示例。
我可以很容易地得到一个StringHome
实例的泛型类 extends Home<String>
,但我不能对new Home<String>()
实例做同样的事情。我怎样才能获得它?
我的目标是使mainKO
方法正常工作mainOK
。
这个类的执行打印出这个: