问题标签 [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.

0 投票
2 回答
324 浏览

haskell - 在临时多态函数和参数多态函数之间转换的好方法

我想知道是否有通用方法可以在临时多态函数和参数多态函数之间进行转换。换句话说,给定一个特殊的多态函数,如何实现它的参数对应?反过来呢?

sort个例子。很容易sort :: Ord a => [a] -> [a]写成sortBy

但反过来似乎很棘手,到目前为止,我能做的最好的就是有点“面向对象”:

但这听起来更像是一种技巧,而不是正确的解决方案。

所以我想知道:

  1. 这个具体例子有更好的方法吗?
  2. 在临时多态函数和参数函数之间转换的一般技术是什么?
0 投票
1 回答
90 浏览

haskell - 类型变量中的任意单子变压器堆栈

0 投票
2 回答
82 浏览

scala - 当 Scala 中需要隐式时,参数多态性会中断

我明白了

找不到类型 T 的 Json 序列化程序。尝试为此类型实现隐式写入或格式。

我将有一个Writes实际参数类型,但我认为这不会清除编译错误。经过一番谷歌搜索后,我觉得我对这个主题的理解可能缺少一些基本的东西。任何帮助表示赞赏。

0 投票
1 回答
155 浏览

f# - 序列表达式和多态递归如何一起发挥作用?

这个项目对我来说确实是一个问题的来源

我已经了解了多态递归,并且理解为什么它是一种特殊情况,因此 F# 需要完整的类型注释。

对于常规功能,我可能需要一些技巧,但通常会做对。现在我正在尝试使(工作)基础适应toSeq更专业的手指树,但不能。

我的感觉是计算表达式的使用与它有关。这是精简的工作版本:

我无法编译的是这个:

我收到的错误消息说

错误类型不匹配。期望
FingerTree<Size,Node<Size,Value<'a>>> -> 'b
但给定了
FingerTree<Size,Value<'c>> -> seq<'c>
类型 'Node<Size,Value< 'a>>' 与类型 'Value<'b>' 不匹配

曲线下划线的递归调用toSeq

我知道“更深”的类型被封装在 aNode中,并且在工作代码中我​​只是在之后解压缩它。但是在我有机会解包之前,编译器已经跳闸了。尝试 afor (Value deep) in toSeq deeper do yield deep有同样的问题。

我已经有一个出路,即使用toSeq“基地”TreeSeq.map unpack之后。不正确,尝试会产生非常相似的错误消息。

我很好奇是什么让这段代码中断以及如何修复它。

0 投票
2 回答
481 浏览

java - Java 两级参数化类型推断

我有一些返回通配符参数化类型的代码。我正在尝试将其传递给参数方法,但出现编译器错误。有人可以向我解释为什么类型不匹配,以及解决这个问题的最佳方法是什么?

编译错误:

在我的真实代码list中,是由一个复杂的方法生成的,该方法可以返回多种类型的“列表”(实际上是一个自定义泛型类)。是否有另一种方法来参数化 useList 函数,以便它以类型安全的方式接受它?


编辑 1

我试图将一大段代码简化为一个简洁、连贯的问题。从答案中我可以看到上面的代码过度简化了我遇到的确切问题。我将尝试用一个更复杂的例子来重申,同时更好地指定我的约束。

首先,我实际上并没有使用 List,而是使用双参数化的更复杂的类。我想不出任何标准类可以做到这一点,所以我将定义一个用于示例:

我会避免多次重复使用一个类型,这样更容易保持水平。useList() 方法确实需要双重参数化,因为它在内部使用这两种类型:

只要你有一个具体的类,这个框架就很好用:

问题是我有一个可以是几种不同类型的输入列表:

这打破了上述许多可能的模式。

所以问题是我在编译时无法知道 numList 的具体类。而且我不觉得我在做任何实际上类型不安全的事情,因为我知道 numList 的类型必须与 useList 返回的类型相匹配,依此类推。

我确实可以控制大部分代码的类型签名。但是,我更喜欢以下内容:

  • 它应该与具体类(例如 intList)很好地并以类型安全的方式工作
  • 它还将接收其类型直到运行时才能明确知道的输入
  • 如果执行强制转换或其他未经检查的操作,它们应该发生在输入的构造附近。应检查以下操作。

有关完整(但非编译)的 java 文件,请参阅https://gist.github.com/sbliven/f7babb729e0b1bee8d2dabe5ee979431。由于我对这个问题感兴趣,请参阅https://github.com/biojava/biojava/issues/354

0 投票
3 回答
1635 浏览

types - Common Lisp中的依赖类型/参数多态性?

我想编写一些处理反射组的通用代码,因此需要设置一些反映数学结构的类型(向量空间、仿射空间......)。因为我真的想在类型中忠实地反映这些结构,所以我需要一种方法来定义某种参数类型。

所以特别是,我希望能够编写以下代码

它应该指定一个新类型 RealVectorSpace,它将由三元组(V 向量加标量)给出,其中 V 可以是任何东西,向量加是一个函数,它采用 V 类型的两个参数(原文如此),其计算结果为 V 类型.

当然,这种类型并不能完全忠实地反映实向量空间的概念,因为 vector-add 和 scalar-mult 仍然需要满足一些进一步的属性。但是,即使将上面的“梦想”变成真正的代码,我也无法做到。

编辑:针对 sds 的回答,让我对我原来的问题提出以下说明:简而言之,我似乎需要在 Lisp 中有依赖类型,这与仅要求参数类不同。事实上,Haskell 有参数类型,但没有(至少它不是以明显的方式内置的)依赖类型。例如,这里讨论了 Haskell 中缺少依赖类型的问题。

1. 谁能帮我把梦想变成代码?

2. 我听说在某个地方你不需要 Lisp 中的参数类,因为 Lisp 宏。如果这是真的,有人可以解释一下您将如何使用 defmacro 在 Common Lisp 中实现/伪造参数类吗?

0 投票
1 回答
521 浏览

scala - Parametric polymorphism in scala

I'm trying to implement parametric polymorphism to devolve functions that have case matching statements that use asInstanceOf[]. I need to match the type of arguments to a classes in another package of the project which accepts parameters. I've tried this code:

On running, I get an error saying A does not take parameters. How can I match A to few of the classes in project1.package1 folder? These classes are similar to an Array/Vector and x(i) returns ith element. Each class takes a different datatype (like Int, Double, String etc).

0 投票
0 回答
62 浏览

haskell - 如何告诉类型检查器绑定中的类型签名与顶级类型签名匹配?

背景

有时我喜欢向我的where和绑定添加类型签名,因为它可以帮助我记住我需要我的结果是什么以及我的输入是什么。let它还有助于类型检查器在我出错时给我一个明确的错误消息。但是,它最近给我带来了问题:

给定

这是一个公认的人为的最小示例:

GHC 吐出一个错误:

TL;DR = GHC 无法推断a第 7 行的类型签名中的 与第 11 行的类型签名中的 相同a

如果我注释掉第 11 行,每个人都很高兴。

问题

loop有没有办法以GHC / Haskell 知道它在两个地方都相同的方式编写类型签名a

0 投票
0 回答
74 浏览

haskell - 为什么 Control.Monad.Trans.Writer.censor 不允许转换 writer-type?

签名

然而,我们可以很容易地得到严格更一般的

当然,这对于mtl吊坠来说不会那么容易,但这是一个令人信服的理由吗?或者它可能与性能有关?

0 投票
2 回答
639 浏览

python - Python 3 中函数多态的装饰器方法

我有一个f接受参数的函数iABi是计数器,A并且B是列表或常量。该函数只是添加第 i 个元素,A如果B它们是列表。这是我用 Python 3 编写的。

您会注意到该const_or_list()函数在两个(但不是全部)输入参数上调用。是否有一种装饰器(可能更 Pythonic)方法来实现我在上面所做的事情?