问题标签 [pattern-synonyms]

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 回答
168 浏览

r - 使用 wordnet 提取同义词

我目前正在研究我的论文并用 R 语言实现解决方案。我必须使用 word-net 词典库查找同义词。我得到了针对单个单词的同义词,但是当我尝试使用循环获取单词集的同义词时,我收到错误“订阅已超出约束”。如果有人可以指导我如何获取文本中每个单词的同义词使用循环还是有其他方法可以做到这一点?这是我正在尝试的代码

*

0 投票
0 回答
78 浏览

haskell - 模式和视图模式:我这样做对吗

我想实现

我想我是通过 View 模式到达那里的,但代码似乎很冗长。有没有更优雅的方式?

补充:谢谢@chi。我很想写

有了这个想法,编译器将这些方程视为定义一对函数,根据需要从 l 到 r 或 r 到 l 读取,并从上到下读取以进行模式匹配。

0 投票
1 回答
55 浏览

r - 使用 R 识别数据框中文本列的同义行

假设 ABC 是一个数据框,如下所示:

我的目的是在 Column4 中找到同义字符串。在这种情况下,我买了它它是我买的我买了它是同义词或相似的字符串,花有美丽的香味花闻起来很好传达类似的意思。

我在以下线程中尝试了IVR的方法并卡住了:Find similar texts based on paraphrase detection

当我运行 HLS.Extract 代码块时,我收到以下错误消息:

使用 as.character 也不能解决问题:

  1. 出了什么问题?

  2. 有没有更好的方法使用 R 对其进行编码,并另外创建一个新列,例如数字 1 作为第一个同义字符串的条目,2 作为下一组同义字符串的条目?

  3. 它适用于德语文本吗?

0 投票
1 回答
168 浏览

haskell - 模式同义词作为函数的无趣/困惑

使用PatternSynonyms显式双向形式),pattern-to-expr 方程实际上形成了一个函数,但拼写为大写(假设您最终得到一个正确类型的完全饱和的数据结构)。然后考虑(在 GHC 8.10.2)

那么我应该为pattern Pred n <- ???价值模式顶线添加什么?或者我可以不使用Pred n模式匹配吗?似乎有效(但我不明白为什么)是一种视图模式

Pred在这里用作伪构造函数/模式看起来很不错,因为它是一个单射函数。

0 投票
1 回答
78 浏览

haskell - 编写模式同义词以隐藏构造函数

考虑以下:

我怎么能写模式P

基本上我可以说:

也就是说,能够在不引用私有构造函数的情况下直接在定义它们的模块之外进行模式PrivateA匹配PrivateB

0 投票
1 回答
103 浏览

haskell - 模式同义词签名:必需与提供的约束

我想我是通过约束的“不寻常形式”来理解它的。只是检查 ...

该部分中提供的约束(第二个)的示例似乎都涉及数据构造函数中的 GADT/existentials(?)有了这里的答案,我不确定是否涉及存在(在 Vinyl 库中),但是for的类型比传递给它rhead的参数具有更具体的类型。f并且 tbhPatternSynonym似乎是一条红鲱鱼:OnlyRecord不出现在frhs 上的论点。

所需的约束(两个中的第一个,或者如果有一个,则只有一个)似乎提供与现在已弃用的相同功能DatatypeContexts(?)

有了额外的优势,我可以在NilSet没有参数的情况下对模式设置必需的约束,甚至不允许构建具有不可接受类型的空集。DatatypeContexts对于这样的构造函数,只需忽略约束。

编辑/重点问题:(回复@Noughtmare 评论)

pattern ConsSet上面定义的和这里的构造函数之间是否有明显的区别DCConsSet

我的意思是“差异”,而不是一个模式,一个是构造函数。我已经尝试在构建和匹配值中使用它们;我得到同样的行为。

0 投票
2 回答
76 浏览

haskell - 构造函数约束的设计选项:GADT 比较 PatternSynonym 必需

(这是这个答案的后续,试图让 q 更精确。)

用例构造函数来构建/访问Set数据类型。作为一个集合,不变量是“无重复”。为了实现这一点,我需要Eq对元素类型进行约束。(更现实地,该集合可能被实现为 BST 或哈希索引,这将需要一个更严格的约束;使用Eq这里来保持简单。)

  • 我想禁止建立一个不可接受的类型的空集。
  • “现在认为对不需要约束的操作(数据类型构造或破坏)进行约束是不好的做法。相反,约束应该移近“使用站点”。”,引用该答案。
  • 好的,因此无需将约束“内置”到数据结构中。访问/解构的操作(如showing 或计数元素)不一定需要Eq.

然后考虑两种(或更确切地说是五种)可能的设计:

(我知道一些约束可以通过deriving, esp Foldableto get来实现elem。但我会在这里手动编码,所以我可以看到 GHC 想要的最小约束。)

选项 1:对数据类型没有限制

选项 1a。使用 PatternSynonym 作为“智能构造函数”

  • GHC 推断约束elemS :: Eq t => t -> NoCSet t -> Bool。但它并没有推断出ConsSet使用它的约束。相反,它拒绝该定义:

  • 好的,我会这样做,使用明确为空的“提供”约束:

  • 因此推断 type (\(ConsSet x xs) -> x) :: Eq a => NoCSet a -> a,因此约束从析构函数(也从elemS)中“逃脱”,无论我在“使用站点”是否需要它。

选项 1b。将 GADT 构造函数包装为“智能构造函数”的模式同义词

  • GHC 不会抱怨缺少签名,会推断pattern ConsSetC :: () => Eq a => a -> NoCSet a -> CSet a出提供的约束,但需要为空。

  • Inferred (\(ConsSetC x xs) -> x) :: CSet p -> p,因此约束不会从“使用站点”中逃脱。

  • 但是有一个错误:要 Cons 一个元素,我需要解开尾部NoCSet内部的内部CSet然后重新包装一个CSet. 并且尝试仅使用模式来做到这一点ConsSetC是错误的。反而:

  • 作为“智能构造函数”,这很愚蠢。我究竟做错了什么?

  • 推断insertCSet :: a -> CSet a -> CSet a,所以约束也没有逃脱。

选项 1c。将 GADT 构造函数包装为“更智能的构造函数”的模式同义词

  • 与选项 1b 相同的设置,除了这个怪物作为 Cons 模式的 ViewPattern

  • GHC 不会抱怨缺少签名,而是pattern ConsSetC2 :: a -> CSet a -> CSet a完全没有限制地推断。我很紧张。但它确实正确地拒绝了构建具有重复项的集合的尝试。

  • 推断(\(ConsSetC2 x xs) -> x) :: CSet a -> a,因此不存在的约束不会从“使用站点”中逃脱。

  • 编辑:啊,我可以得到一个不那么可怕的ViewPattern表情来工作

  • 奇怪地推断pattern ConsSetC3 :: () => Eq a => a -> CSet a -> CSet a——所以提供的约束是可见的,不像 with ConsSetC2,即使它们在道德上是等价的。它确实拒绝尝试构建具有重复项的集合。

  • 推断(\(ConsSetC3 x xs) -> x) :: CSet p -> p,因此存在的约束不会脱离“使用站点”。

选项 2:数据类型的 GADT 约束

GHC 推断没有可见的约束elemG :: a -> GADTSet a -> Bool(\(GADTConsSet x xs) -> x) :: GADTSet p -> p.

选项 2a。使用 PatternSynonym 作为 GADT 的“智能构造函数”

  • GHC 不会抱怨缺少签名,会推断pattern ConsSetG :: () => Eq a => a -> GADTSet a -> GADTSet a出提供的约束,但需要为空。
  • Inferred (\(ConsSetG x xs) -> x) :: GADTSet p -> p,因此约束不会从“使用站点”中逃脱。

选项 2b。定义插入函数

  • GHC 推断insertGADTSet :: Eq a => a -> GADTSet a -> GADTSet a;所以Eq已经逃脱了,即使它没有逃脱elemG.

问题

  • 有了insertGADTSet,为什么约束会逃脱?它仅用于elemG检查,但elemG' 类型不会暴露约束。
  • 使用构造函数GADTConsSet, GADTNilSet,有一个约束“一直”包裹在数据结构中。这是否意味着数据结构比 with 具有更大的内存占用ConsSet_, NilSet_
  • 使用构造函数GADTConsSet, GADTNilSet,它a“一直向下”是相同的类型。Eq a每个节点是否重复相同的字典?还是共享?
  • 相比之下,模式ConsSetC/constructor CSet/Option 1b 仅包装一个字典(?),因此它的内存占用比GADTSet结构(?)
  • insertCSetunwrapping 和 wrapping 对性能有影响CSet吗?
  • ConsSetC2在构建方向上似乎有效;展开和包装CSets 会影响性能吗?但更糟糕的是,在访问/遍历节点时会影响展开/包装性能吗?

(对于我的用例,我觉得在这些选项中没有灌篮高手。)

0 投票
1 回答
92 浏览

haskell - 模式同义词能否在每个方向上具有不同的类型签名,就像数字文字一样?

考虑数字文字1。它有不同的类型,具体取决于它是用在等号的左边还是右边。中f True = 11有类型Num p => p。但在f 1 = True1有类型(Eq a, Num a) => a。是否可以创建以相同方式工作的模式同义词?例如:

该模式仅在它同时具有ReadShow类时才有效,无论它位于等号的哪一侧。有没有办法让它Show a => a在等号的左边有类型,但Read a => a在右边?非工作伪代码:

0 投票
1 回答
101 浏览

haskell - 为什么接受递归模式同义词?

这个问题(从 5 年前开始)问“为什么所有递归模式同义词都被拒绝?” 它的例子仍然被拒绝。用户指南说“模式同义词不能递归定义。”

我有一个被接受的递归模式同义词(GHC 8.10.2)。我可以调用它,它会循环 - 不足为奇。那么为什么它会编译?/这样的事情是否有合理的用例?

基于2016 年论文第 2.3 节“多态模式同义词”中的示例的代码。

我正在尝试定义模式同义词Nil。显然JNil是一场比赛。而且,和任何提供所有叶子的JNil ``JoinTree`` JNil任意嵌套都是。JoinTreeJNil

尝试调用wot循环,不足为奇。试图打电话wotwotwot抱怨Non-exhaustive patterns in function wotwot

完全披露:我正在玩的/我知道这不起作用[另见下文]是:

以下被拒绝Recursive pattern synonym definition- 这是我所期望的

无论如何,这是行不通的:它需要首先匹配NilRec = JNil作为基本情况。


要回答@Noughtmare 的 q“你会如何建议......”对他的回答的评论,我想根据上面的“我在玩什么”写 decl(是的,我知道这是目前非法的语法);并将其脱糖到具有两种情况的匹配器中,依次尝试:

请注意,这些案例中的每一个都有一个来自 type 的最外层数据构造函数JoinList。因此,递归使用Nil是受保护/中介的,就像通过 ViewPattern 的任何方法一样。(这是 q 5 年前的问题。)换一种说法:我认为编译器可以从pattern ... = ... where ... <- ....

0 投票
1 回答
96 浏览

haskell - 为什么我的模式在两边都阻止了错误?

为了开始这整个事情,我正在使用定义如下的模式同义词:

这允许我一次跨一个参数运行多个模式匹配。常规 as binding ( @) 不允许左侧成为模式,但确实如此。

有了这个,我做了以下玩具功能

我敢肯定,这不是实现这一点的最佳方式,但它是所讨论行为的最低工作示例。

这有一个接受单个参数的函数。它使用定义的同义词将参数与两个模式匹配。第一个模式匹配任何非空列表并且不进行绑定。第二个在列表上运行 head 函数并绑定y到结果。

所以问题是会head导致错误还是其他模式会阻止它?

其他模式阻止它!好吧,如果我按照其他顺序执行它们,那么它应该会中断吗?

没有!它仍然有效。所以现在我的问题是:第二种模式有什么作用吗?也许视图模式具有某种智能行为,它调用函数并在发生错误时使模式失败......

不……它没有。这失败了。(_:_)无论错误在哪一边,都会以某种方式阻止错误。也许 ghc 更喜欢在视图模式之前匹配解构模式?为了测试这一点,我可以(_:_)(reverse -> _:_). 这样,它必须先运行一个函数,然后才能进行解构。

但是经过测试,新模式不会改变行为。可以排除这个假设。

所以也许是懒惰? x如果列表为空,则无法评估,因此它位于 thunk 中并且永远不会发生错误。似乎有些情况。如果我替换(head -> x)(undefined -> x)我们的行为没有变化。

但是,如果我将其替换为(undefined -> "yo")

undefined确实得到评估。这似乎表明该模式迫使评估与"yo". 如果我现在切换顺序:

它不被评估。看来现在我们正在短路模式匹配。

所以懒惰假设似乎有道理?它对我来说仍然非常不透明,我希望有人对 ghc 的内部有更多经验来证实这个假设。

所以我的问题是现在发生了什么?是懒惰吗?它是如何工作的?

非常感谢不和谐用户 lexi。到目前为止,他们对诊断有很大帮助。