问题标签 [active-pattern]
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.
f# - 将部分活动模式作为参数传递?
我正在通过使用活动模式编写递归下降解析器来学习 F#。
由于我的所有规则或部分活动模式我需要以不同的方式组合它们,但我对将活动模式作为参数传递的语法感到非常沮丧。
以下示例显示了我遇到的麻烦:
我的主要困惑似乎是关于“|” 操作员。有时它似乎是模式类型的一部分,有时是名称的一部分。
f# - 直接调用多案例活动模式
考虑一个单例活动模式:
我可以在显式匹配之外调用上述单例活动模式:
如果我有以下多案例活动模式:
如何直接调用上述多案例活动模式?明显的方法不起作用:
上述请求的原因是在活动模式上编写测试,而不显式引入匹配。目前,如果要测试活动模式|Even|Odd|,需要引入下面的isEven函数。
如果我能做到,那就太好了:
提前感谢您的任何帮助!
盛
list - 以任何顺序匹配列表项
当谈到 F# 的许多领域时,我仍然是新手。我问这个问题更多是出于好奇,而不是出于实际的业务需求。有什么方法可以匹配列表中的前n 个项目,而不管它们出现的顺序是什么?为了澄清,请考虑以下示例:
some_func
现在,假设如果列表中的前两项是 aFoo
和 a ,我想以Bar
任意顺序调用。匹配两种可能的排列相当容易:
但是,如果前 3 项是 a并且以任何顺序调用函数Foo
,我该怎么办?使用上述相同的技术将需要我编写所有 6 种不同的排列(或n!对于n 个项目)。理想情况下,我希望能够按照以下方式做一些事情:Bar
Baz
有没有办法通过某种活动模式来实现这一点,而不必对不同的排列进行硬编码?
f# - F# 避免主动模式覆盖
我注意到我无法创建两个具有相同选项的活动模式,但我可以在没有任何警告的情况下创建两个具有相似选项的模式:
因此,当以这种方式匹配时:
有时候是这样的:
我有点担心会无意中覆盖现有的活动模式选项,例如,由于不同的语义上下文(如(|Direct|Indirect|)
(路由)和(|Alternating|Direct|)
(当前)),同一个词可能出现在不同的模式中。
我怎样才能避免这种情况?
f# - 在 F# 中适当使用活动模式
我正在使用活动模式来解析 csv 格式的使用日志中的使用事件。下面列出了活动模式部分。解析整个文件效果很好,并且生成的序列充满了各种 UsageEvents。
我遇到的问题是我可能以错误的方式使用 ActivePattern。我想根据一些逻辑遍历列表以从中创建一棵树,但我无法在解析后匹配序列中的条目。
这种匹配不起作用,因为循环函数需要一个string list
. 我可以通过什么其他方式使用联合中包含的数据,或者我应该匹配输入然后将其存储在常规类型中?
compiler-errors - 多案例参数化活动模式返回错误 FS0722 只有返回一个结果的活动模式才能接受参数
因为我只找到了关于这个错误的日语页面,所以我想,让我们把它记录下来并在这里提问,因为我的日语有点生疏了。
如果我有以下 FSharp 活动模式(简化示例):
它完美编译并将其类型显示为:
但是当我尝试使用它时,即如下,它会抛出一个错误:
抛出:错误 FS0722:只有返回一个结果的活动模式才能接受参数
我可以通过将其转换为两个单例参数化活动模式来解决它,每个模式都返回 None/Some(x),但我仍然想知道为什么我不允许这样做和/或是否有我可以使用的语法不知道。我也想知道为什么它可以编译,但我不能使用它?
f# - 带判别联合的主动模式匹配
有没有办法将以下形式的可区分联合与活动模式匹配一起使用?我找不到任何例子。
这就是我想要做的:
为什么“Some”不能用第二种方式?有没有另一种方法来实现同样的目标?
f# - 是否可以在有区别的联合的基础形状上进行模式匹配?
F# 是否支持通过标识符模式以外的标准对已区分的联合成员实例进行模式匹配?
例如,假设我想匹配数据的底层形状,并且我想考虑任何具有int * int
形状的东西,而不管 DU 如何对值进行分类。是
这是我现在的做法:
我想要更接近以下内容:
F# 目前是否支持一些类似的表达语法,或者我是否坚持明确指定所有情况?
注意:我知道我可以弄清楚如何通过反射找到我想要的信息,但我对这样的解决方案不感兴趣。
f# - 如何在函数表达式中编写 F# 活动模式匹配函数?
我们有这个小辅助函数
在函数接口中使用主动模式匹配函数 NonEmptyString 可以正常工作:
现在来解决问题。
将一些验证器组合在一起作为更复杂的验证约束会很好,就像这样
如果只允许一个 's',我们可以考虑组合这些函数,这样我们就只有一个参数 s。并且因为活动模式匹配函数当然是函数,所以应用函数组合运算符 >> 但它不适合这里。
问题是,我们如何才能做到这一点(在 F# 4.0 中)?
f# - 为什么我要为活动模式使用关键字“内联”?
我仍然不明白为什么我会使用关键字inline
为函数使用关键字。
它给了我什么我还没有的东西?