问题标签 [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 回答
127 浏览

haskell - 帮助编写 monad 类型类(关联类型类?)

我想编写一个 monad 类型类,它将为 DSL(特定于域的语言)monad 指定一些基本操作。

whereExprType表示表达式的类型,并且var会引入一个新的变量声明。

这个想法是我将有一个基本的 monadBase实现MyDSLMonad,它可能只适用于Int's 和Bool's 之类的东西,然后更高级别的抽象将是 monad 转换器,它可以在更高级别的类型上工作。

但是,Base'函数的实现可能依赖于它仅适用于' 和'var的事实,并且需要对该函数进行某种类型的类约束。所以,我想要类似的东西IntBoolvar

我知道rmonads通过某种类型的大小写来做到这一点,但是有更好的方法吗?另外,我有点喜欢像StateT在常规 monads 包中那样使用 monad 转换器...... :)

0 投票
1 回答
123 浏览

haskell - haskell——不明白为什么这个关联类型的例子需要更多的推理

考虑以下代码,

然后,如果尝试使用 expTypeArg 函数编写一个实例,

编译器抱怨

但是,如果添加一些作用域类型表达式,

然后它解决得很好。ExprTyp == MyBaseExpr解决什么问题expTypArg

编辑

非常感谢,丹尼尔!在注意到只强制执行需要的类型之后,这是一种去掉一些冗长的方法。

0 投票
1 回答
1277 浏览

haskell - 在 haskell 中编写仅适用于关联类型的函数

我正在尝试找到一种更优雅的方式来编写以下代码。

这会产生错误。

我目前的解决方案是添加一个虚拟变量,从中可以得出正在使用的特定 C。

我知道这是关联类型不是单射的另一个实例,但我无法弄清楚。当然,E 可能不是单射的,但似乎某处g将适用于D类中引用的特定 (E c) 的信息已经丢失。

任何解释,更重要的是更好的解决方法将不胜感激。谢谢!

编辑

好的,我看到切换typedata使代码工作。

我试图弄清楚这可能是如何工作的。每个都c创建一个新的数据类型E c。在实例上下文中,我们必须匹配forall a. ((E) c) a -> ((E) c) a. forall a. ((E) c) a -> ((E) c) a表示,然后我们与自身F = E c匹配。forall a. F a -> F a

我很难看到类型同义词(关联类型)案例在哪里出现问题。当然,可以定义两个A都具有签名的实例(E c) a -> (E c) a。但是,为什么使用A c范围内的实例中的定义是错误的呢?

谢谢!!

0 投票
1 回答
205 浏览

haskell - GHC 类型推断问题

问题。有没有办法让这段代码在没有显式类型签名的情况下工作?

代码。首先,我有一个实践中更好的替代MonadTrans课程,灵感来自Data.Newtype. 看起来像这样,

然后,我有一个A带有 method的类foo,如果某个基本 monadM是 an A,那么任何转换后的 monadT M也是 an A。在代码中,

但是,如果我现在想创建一个foo替换它的第一个参数的快捷方式,那么我需要一个显式类型签名,否则编译器的上下文堆栈会溢出。

有助于推断的可能信息。假设我们有一个关联的类型B :: * -> *。我在想我想告诉编译器B满足B t /= t,B (B t) /= B t等,即B在某种程度上是“单调的”——追逐关联类型相当于删除 newtype 包装器,它应该知道它不能永远删除 newtype 包装器,因此添加签名的上下文A是必要的。

0 投票
2 回答
142 浏览

haskell - haskell——如何避免这种无限类型?(相关数据和StateT)

我想将状态单子转换器的状态参数的类型设置为该单子转换器的关联类型。但是,这会导致构造一个无限类型,

关于为什么这不是一个真正的问题的直觉是,

对于所有ss'。但是,编译器不够聪明,无法解决这个问题。我读过,在某些情况下,可以使用 newtype 来避免无限类型;我该怎么做?

这是重现问题的最小化代码,

0 投票
1 回答
613 浏览

php - 导入的配置产品没有关联

我正在使用 Magento 1.7。我能够成功导入可配置产品,但相关产品没有链接到它。我必须通过我的管理员手动链接它们。如何通过 csv 文件链接它们?

0 投票
1 回答
5876 浏览

haskell - 使用模板 Haskell 获取关联的类型同义词

模板 Haskell 可以找出类型类中声明的关联类型同义词的名称和/或声明吗?我希望reify会做我想做的事,但它似乎并没有提供所有必要的信息。它适用于获取函数类型签名:

但是,向类添加关联的类型同义词不会导致输出中的任何更改(直到重命名):

如果我知道 的名称F,我可以查找有关它的信息:

但我一开始就找不到名字F。即使我添加了类型类的实例,InstanceD也没有关于定义的信息:

如果reify不起作用,除了手动列出关联类型同义词之外,是否有解决方法?

这个问题存在于 GHC 7.8.3 和 2.9.0.0 版本的 template-haskell 包中;它也存在于 GHC 7.4.2 中,带有 template-haskell 包的 2.7.0.0 版本。(我没有检查 GHC 7.6.*,但我想它也存在。)我对任何版本的 GHC 的解决方案感兴趣(包括“这仅在 GHC 版本V中修复”)。

0 投票
2 回答
234 浏览

haskell - 为什么引入关联类型会扼杀我的表现?

在我的kdtree项目中,我只是将深度计数器从 -based 替换为基于in类型Int的显式计数器。这是差异Key aaKDTree v a

现在虽然我认为这应该是类型级别的更改,但我的基准测试显示性能急剧下降:

前:

后:

在我深入核心之前......有人知道这里发生了什么吗?

编辑 1

正如 Thomas(和 userxyz)所建议的那样,我相应地替换data Key a :: *type Key a :: *更改了实现。这对结果没有任何显着影响:

编辑 2

刚刚快速浏览了核心输出。显然,更改会根据要专门化的类阻止功能,对吗?

前:

后:

编辑 2的小更新:使用INLINE 编译指示发疯并不会改变任何事情。

编辑 3

快速实现userxyz 的建议:http ://lpaste.net/104457 以前去过那里,不能让它工作:

编辑 4

嗯......我想我只是通过在函数中抛出SPECIALIZE pragma 来“解决”这个问题。这实际上导致所有内容都被内联并删除显式字典传递。

我对这个解决方案不太满意,因为这意味着我必须在文档中放置一个很大的“请专业化你的调用以实现良好的性能”警告。

0 投票
1 回答
224 浏览

generics - Swift 泛型和关联类型的错误

以下 Swift 代码反复使编译器崩溃。我错过了什么?

0 投票
1 回答
169 浏览

ios - 类型 X 不继承自 Y

以下 Swift 代码在最后一行产生此错误:Type 'E' does not inherit from 'C<Self>'. 不知道这里发生了什么。任何线索将不胜感激。

更新:我简化了损坏的示例。旧版本(milos 的答案所指)可以在这个问题的编辑历史中找到。