当前位置: 首页 > 知识库问答 >
问题:

与基金绑定约束

咸承教
2023-03-14

我有一个函数foo,有一系列约束。当然,这些约束必须出现在使用foo的函数的签名中,所以我试图将foo约束包装在类型同义词FooCtx a b…::约束。例如,

foo :: (A a, B b, C c, ...) => a -> b -> c

bar :: (A a, B b, C c, ...) ...
bar = ... foo ...

会成为

type FooCtx a b c ... = (A a, B b, C c, ...)
foo :: (FooCtx a b c) => a -> b -> c
bar :: (FooCtx a b c) => ...

如果所有类型都公开,这将非常有效。但是,我使用函数依赖来生成约束列表中的一些类型,这些类型不会出现在foo的签名中。例如:

class Bar a b | a -> b

foo (Bar a b, ...) => a -> a

GHC不接受type FooCtx a=(Bar a b),因为b在LHS上没有绑定。我也不能使用type FooCtx a b=(Bar a b),因为b不在foo的签名范围内。foo的签名将是foo::(FooCtx a?)=

一个不令人满意的解决方案是在foo签名中使用foCtx将fundep类型置于作用域中:

class Bar a b | a -> b

type FooCtx a b = ...

foo (Bar a b, FooCtx a b) => a -> a

但这违背了将约束分组的目的:

在遇到这种情况之前,我一直认为约束同义词可以盲目地替代任意约束列表。我所知道的封装约束的唯一其他方法是使用类,但它遇到了相同的问题:class(a,B,C,…)=


共有2个答案

萧献
2023-03-14

这个问题可以通过TypeFamiliesFlexibleContexts解决。

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}

我们有三个类,AB,和C和原始的foo函数。

class A a
class B a
class C a

foo :: (A a, B b, C c) => a -> b -> c
foo = undefined

Bar类使用类型族来计算Ba的搭配。我添加了一个附加函数,只是为了编写示例foo'

class Bar a where
    type BofA a :: *
    aToB :: a -> BofA a

foo'是一个函数,它没有任何输入或输出是B,但在其实现中仍然使用foo。它要求与a关联的BofA类型满足B约束。这种签名需要灵活的上下文。

foo' :: (A a, Bar a, B (BofA a), C c) => a -> a -> c
foo' x y = foo x (aToB y)
包和泰
2023-03-14

您误解了类型变量的绑定方式。它们不受tau类型(thea)的约束-

在你的例子中,当你写一些像

foo :: (Bar a b) => a -> a

然后,完整的sigma类型,以及显式的tyvar绑定,如下所示(因为在隐式情况下,来自phi类型的所有tyvar都在这里绑定)

foo :: forall a b. (Bar a b) => a -> a

这意味着以同样的方式使用约束别名是没有问题的:如果你有例如。

type FooCtx a b = (Bar a b, Num a, Eq a)

下面是一个有效的类型签名:

foo' :: forall a b. (FooCtx a b) => a -> a

因此,以下速记也是有效的:

foo' :: (FooCtx a b) => a -> a

 类似资料:
  • 我知道Java和C#,但属性绑定我只知道C#MVVM。我试图理解JavaFX中的属性绑定,使用属性值的自定义getter和setter(就像在C#中一样)。 我创建了以下类: 我的印象是,如果我遵循推荐的JavaBean/JavaFX命名约定,那么绑定系统将足够聪明地使用反射(?)并为该属性使用自定义getter/setter。但是我的视图模型getter/setter从来没有使用过。 在C#中,

  • 问题内容: 最初使我不愿在代码中加入太多可选绑定的一件事是添加了更多的变量名。例如,我通常会写: 因为替代方案似乎有些混乱: 那是很多香蕉。我见过人们使用诸如新变量名之类的东西(在较大的代码块中可能很难看懂),但是我想知道是否存在一种普遍认可的变量名样式标准可以与可选绑定?谢谢阅读。 问题答案: 只需使用相同的名称: 不要使用匈牙利符号-如果您使用的是未包装的可选内容,则编译器会抱怨。

  • 静态绑定还是动态绑定? 这显示了什么样的多态性?

  • 问题内容: JGoodies绑定和JSR 295(Beans绑定)之间的实际区别是什么?他们似乎都旨在达到相同的目的,并完成他们的工作(方法略有不同)。JGoodies Binding更成熟,但是JSR 295最终成为Java 7中JDK的一部分。 对于相同的功能,使用JDK的标准部分肯定比使用单独的库更好,但是还有其他因素需要考虑吗?还有其他选择吗?在这些选择之间进行选择是非常不可逆的体系结构决

  • 问题内容: 我试图写一个计算器,有一个问题。我已经为所有按钮制作了动作监听器,现在我希望可以从键盘输入数据。我是否需要对KeyListener或Keybinding进行全部操作,还是有其他方法可以使单击按钮后将其发送到actionlistener中的说明?还有更好的方法:Keylistener或Keybinding 问题答案: 一般而言,在您的键输入集有限的情况下,键绑定是一个更好的选择。 遭受与

  • 数据绑定一个常见需求是操作元素的 class 列表和它的内联样式。因为它们都是属性 ,我们可以用v-bind 处理它们:只需要计算出表达式最终的字符串。不过,字符串拼接麻烦又易错。因此,在 v-bind 用于 class 和 style 时, Vue.js 专门增强了它。表达式的结果类型除了字符串之外,还可以是对象或数组。 绑定 HTML Class 对象语法 我们可以传给 v-bind:clas