问题标签 [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.

0 投票
2 回答
201 浏览

f# - 为什么活动模式需要特殊语法?

如果可以将普通函数用作模式,则不必编写琐碎的活动模式,例如

并且假设允许

这将使函数更具可重用性,消除对要与匹配一起使用的“模式化”函数的需要:

我知道活动模式可能被称为函数,因此可以通过定义模式来简化前面的示例。但是放弃特殊的模式语法可以简化这一点。

特殊语法的原因是什么?

编辑

在下文中,活动模式会遮蔽文字。

为什么这也不适用于模式中的函数调用?

编辑 2

我发现了一个模棱两可的场景

在我看来,这阐明了为什么活动模式必须以大写字母开头——它使意图更清晰,并且使阴影(例如在我之前的示例中)的可能性大大降低。

0 投票
1 回答
249 浏览

f# - 重用 F# Active Pattern 结果

在下面的代码中,我必须在每次迭代中重复使用 Active Pattern 结果三次。IE

我发现我可以保存活动模式结果。IE

我不知道是否可以在 match 语句中使用 Active Pattern 结果。IE

问题是可以在匹配语句中使用保存的活动模式结果吗?

如果是这样,怎么做?如果不是,则需要对其进行解释,以使其在逻辑上有意义。

可能为什么不的例子。即语言规范,句法糖,不应该允许绑定活动模式结果,ExprItems vs. PatItems

我查看了 F# 2.0 语言规范(2010 年 4 月) http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html#_Toc270597500

但我没有认出任何可以确认答案的东西。

编辑

如果我将代码更改为

在 Choice1Of7 之后,我收到以下错误(tree.Parent,position):

这个表达式应该有单位类型,但这里有类型 'a * 'b

正如布赖恩建议的那样

结束编辑

注意:我在下面尝试了这个代码,但我确实找到了一个更好的算法来解决它。

0 投票
3 回答
518 浏览

f# - 带有活动模式的 FizzBu​​zz

我试图理解活动模式,所以我在玩 FizzBu​​zz:

这基本上是正确的方法,还是有更好的方法在这里使用活动模式?我不应该能够findMatch使用 int 而不是 int 选项吗?

0 投票
4 回答
539 浏览

f# - F# 3.0 中的活动模式被破坏

此活动模式与 F# 2.0 一起编译:

但是,在 F# 3.0 中,会发出错误:

活动模式 '|Value|_|' 具有包含不由输入确定的类型变量的结果类型。当没有提到结果情况时,常见原因是 [sic],例如,'let (|A|B|) (x:int) = A x'。这可以通过类型约束来修复,例如 'let (|A|B|) (x:int) : Choice = A x'

我试过了:

和:

如何修复?

环境:Visual Studio 2012 (RTM) 和 FSI v11.0.50727.1

编辑:这是一个更简单的复制:

0 投票
2 回答
252 浏览

f# - 结合类型测试和文字的模式

此问题中的活动模式在升级到 VS 2012 RTM 后无法编译。它提供了一种进行类型测试并匹配单个模式中的文字的方法。例如:

这可以在没有活动模式的情况下完成吗?我意识到when可以使用警卫 ( :? string as s when s = "") 但它不能与其他模式结合使用。

0 投票
2 回答
1021 浏览

f# - 试图理解 F# 活动模式,为什么我可以这样做:

我有一个Dictionary我最初这样迭代的:

myDictionary |> Seq.iter (fun kvp -> doSomething kvp.Key kvp.Value)

后来,我发现我可以利用KeyValue活动模式,并这样做:

myDictionary |> Seq.iter (fun (KeyValue (k, v)) -> doSomething k v)

知道活动模式不是某种形式的预处理器指令,我如何能够kvp将 lambda 中的参数替换为分解它的函数?

0 投票
3 回答
302 浏览

f# - 在有区别的联合类型声明中使用活动模式

是否可以在有区别的联合类型声明中使用活动模式?

更准确地说,考虑以下玩具示例:

现在假设我想覆盖 T 中的 ToString()。在 T 的类型声明中,我不能引用 T_ToString,因为此时尚未声明 T_ToString。我无法在 ToString() 之前移动活动模式和 T_ToString ,因为此时尚未声明 T 。但这也不起作用:

0 投票
1 回答
206 浏览

f# - FSharp 活动模式的问题

我正在解析 FSharp 中的代码引用并正在构建模式助手。一切都很顺利,直到我尝试

目的是有一个通用的二进制函数匹配器,它返回“左”和“右”,然后创建专门的二进制匹配器,例如多重、除法和加减法。

但是我在第二种模式上遇到错误

有人可以告诉我我应该在这里做什么吗?

0 投票
1 回答
374 浏览

f# - F# 部分主动模式匹配“规则永远不会被匹配”

给定以下活动模式:

以及以下模式匹配函数:

最后一行的通配符模式说warning FS0026: This rule will never be matched

我看到的所有示例似乎都推断出部分活动模式必须返回Some('a)以匹配,并且返回的模式None被通配符捕获。错误似乎有不同的说法。

我错过了什么?

0 投票
3 回答
270 浏览

f# - 与 AND 模式不完全匹配

我在 F# 中定义了一个表达式树结构,如下所示:

我希望能够漂亮地打印表达式树,所以我做了以下事情:

但是,我不太喜欢failwith该函数的方法,operator因为它不是编译时安全的。所以我将它重写为一个活动模式:

现在我可以format漂亮地重写我的函数如下:

我假设,因为 F# 很神奇,所以这会起作用。不幸的是,编译器会警告我不完整的模式匹配,因为它看不到任何匹配的东西Unary(x)也会匹配Operator(op),任何匹配的东西Binary(x, y)也会匹配Operator(op)。而且我认为这样的警告与编译器错误一样糟糕。

所以我的问题是:是否有特定的原因导致这不起作用(比如我是否在某处留下了一些神奇的注释,或者有什么我没有看到的东西)?是否有一个简单的解决方法可以用来获得我想要的安全类型?这种类型的编译时检查是否存在固有问题,还是 F# 可能会在将来的某个版本中添加?