问题标签 [associated-types]

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 投票
1 回答
129 浏览

haskell - 具有约束返回类型的类型类实例

我正在实现一个在容器和数字类型上通用的内积概念。该定义指出此操作的返回类型是(非负)实数。一种选择(如下所示)是针对每种数值类型(Float、Double、Complex Float、Complex Double、Complex CFloat、Complex CDouble 等)手动编写所有实例。原始类型并不多,但我不喜欢重复。另一种选择,或者我认为,是有一个带有约束的参数实例,例如RealFloat(表示FloatDouble)。

问题

为什么下面的实例不起作用(“无法将类型eDouble..预期类型匹配HT e,实际类型e”)?

0 投票
1 回答
98 浏览

haskell - 需要一个与 haskell 关联的类型同义词的 typeclass 实例

是否可以要求某个类的关联类型同义词是某个其他类的实例?例如,使用类似于以下代码的内容(不编译!):

我将能够依赖这样一个事实,即 aFoo a能够Show不管所讨论的特定a问题。

显然我可以在类中添加更多方法来确保我想要对Foo as 进行的操作,但是能够重用现有类会很好。

0 投票
1 回答
484 浏览

swift - 来自协议类型的 Swift associatedType - 怎么做?

我在使用关联类型作为协议时遇到问题:

当我尝试实现搜索结果协议时,出现编译问题:

“类型 SearchArticles 不符合协议 SearchResultsProtocol”

据我了解,这是因为 SearchArticles 类中的 T 不是来自具体类型(该示例中的结构),而是来自协议类型。

有没有办法解决这个问题?

提前致谢!

0 投票
2 回答
415 浏览

swift - 如何快速组合多个类型擦除模块?

Swift 很了不起,但还不成熟,所以有一些编译器限制,其中包括泛型协议。由于类型安全考虑,泛型协议不能用作常规类型注释。我在 Hector Matos 的帖子中找到了解决方法。通用协议及其缺点

主要思想是使用类型擦除将泛型协议转换为泛型类,这很酷。但是在将这项技术应用于更复杂的场景时,我陷入了困境。

假设有一个抽象的Source,它产生数据,一个抽象的Procedure,它处理该数据,还有一个管道,它结合了一个源和一个数据类型匹配的过程。

我希望客户端代码简单如下:

实现 Source 和 Procedure 很简单,因为它们位于依赖关系的底部:

执行 Pipeline 时出现 PITA

呃,其实这个有效!我在开玩笑吗?不。

我对这个不满意,因为initializerofPipelineImpl非常通用,所以我希望它出现在协议中(我对这种痴迷有错吗?)。这导致了两个目的:

  1. 该协议Pipeline将是通用的。initializer包含一个 where 子句引用placeholder T,所以我需要将intoplaceholder T协议作为associated type. 然后协议变成一个通用协议,这意味着我不能直接在我的客户端代码中使用它——可能需要另一种类型擦除。

    虽然我可以承受为协议编写另一种类型擦除的麻烦Pipeline,但我不知道如何处理,initializer function因为AnyPipeline<T>该类必须实现与协议有关的初始化程序,但实际上它只是一个thunk 类,不应该实现任何初始化器本身。

  2. 保持协议Pipeline非通用。用写之initializer类的

    我可以防止协议是通用的。这意味着该协议仅声明“源和过程必须具有相同的数据类型,我不在乎它是什么”。这更有意义,但我未能实现确认此协议的具体类

    /li>

那么,我该如何处理呢?

感谢您阅读allll本文。

0 投票
2 回答
4468 浏览

swift - 在 Swift 中实现密封类的效果

我正在尝试在 Swift 中实现 Kotlin 密封类的效果,以便我可以实现基于类的替代方法来替代具有关联类型的枚举。

以下导致编译器错误:

有没有办法有效地将 Swift 类从进一步的子类化中“密封”,但仍然首先允许子类化?

0 投票
1 回答
357 浏览

java - Swift 3 中具有关联类型的协议

我发现关联类型对我来说 Swift 有点复杂,尤其是因为我牢记 Java 方法。

我的问题是我想创建一个简单的接口(哦,对,协议),它看起来像这样:

在 Java 中,它看起来像这样:

现在我想将此协议用作方法参数,但我不知道如何在 Swift 中做到这一点,但在 Java 中它看起来像这样;)(以字符串类型为例)

那么如何使用 Swift 实现这一点呢?

0 投票
1 回答
1256 浏览

swift - 为什么我们不能强制转换为具有关联类型的协议类型,而是使用泛型实现相同的效果?

考虑这段代码:

我们得到了可怕且显然令人费解的:

协议 'Collection' 只能用作通用约束,因为它具有 Self 或关联的类型要求。

然而,这愉快地编译:

为什么?!

特别是,编译器知道*相关的类型(the type of)first是如何实现的;它只会得到它们曾经的承诺(因为任何类型的对象Collection 必须实现它们)。第一个例子中也有同样的保证!那么为什么编译器只抱怨一个而不抱怨另一个呢?

我的问题是:在 line *,编译器知道它不 in lineERROR什么?

0 投票
2 回答
645 浏览

generics - 在 UIViewController 静态中返回子类

考虑一个基本的 UIViewController 类...

(注意self.之前instantiate()似乎是获得“那个”实例化器所必需的。)

每个子类都知道自己的故事板 ID 以如何使用instantiateViewController

你可以这样做,

唯一的小问题是,它返回基类。但见下文。所以在实践中你必须

有没有办法修改 staticmake以便确实Dining.make()返回 aDiningBath.make()返回 a Bath

(@Hamish 指出可以使用一个initandSelf模式,方法返回被调用的类型的对象但是,我认为这是不可能的,因为instantiateViewController.)


所以。假设您有类似的代码

实际上。 在运行时, d 确实变成了“餐厅”,而不是“房间”

这太妙了。

但。如果您在 IDE 中执行此操作

它失败了 - 它认为 d 将成为一个房间,而不是 Dining

因此,您的所有代码都必须如下所示:

这很糟糕。怎么修?


请注意TBC 解决方案是使静态成为通用的,而不是 MartinR 在此处的答案https://stackoverflow.com/a/33200426/294884 示例代码在下面的答案中。

0 投票
1 回答
164 浏览

swift - 使用带有协议和关联类型的通用类型?

我正在尝试创建一个可以描述为 a) 保留某种类型的属性的类,例如 T,并保留可以更新同一类型 T 的另一种类型的属性。我认为通过我的 (不工作)示例:

在上面的例子中,我想确保associatedtype协议的泛型匹配myContainer

这可以迅速做到吗?

谢谢!

0 投票
1 回答
124 浏览

generics - 类型参数和 std::ops::BitXor 输出关联类型之间的类型不匹配

我正在学习 Rust。我发现“过度设计”玩具示例在早期阶段是一件有用的事情,这导致我遇到这种情况。

从这个简单的功能开始:

我转向一个简单的变体来摆脱分配:

另一个接受任何可以异或的类型:

第二个变体最初没有编译——但错误消息提示我要添加约束Vec<T>: FromIterator<<T as BitXor>::Output>。大概这个约束给了编译器一些BitXor::Output实际上与 相同的提示T,但我不清楚那个提示到底是什么。

现在......将两者结合起来让我很难过:

产生错误:

强烈怀疑这两种情况是相似的,我需要提供一些额外的上下文来帮助编译器找出T实际上<T as std::ops::BitXor>::Output是另一个名字。

我在正确的轨道上吗?如果是这样,这个提示是什么?

(下一个挑战是让函数接受 IntoIterator 类型而不是切片——如果这可能会影响解决方案的话)。