问题标签 [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# - 为什么活动模式需要特殊语法?
如果可以将普通函数用作模式,则不必编写琐碎的活动模式,例如
并且假设允许
这将使函数更具可重用性,消除对要与匹配一起使用的“模式化”函数的需要:
我知道活动模式可能被称为函数,因此可以通过仅定义模式来简化前面的示例。但是放弃特殊的模式语法可以简化这一点。
特殊语法的原因是什么?
编辑
在下文中,活动模式会遮蔽文字。
为什么这也不适用于模式中的函数调用?
编辑 2
我发现了一个模棱两可的场景
在我看来,这阐明了为什么活动模式必须以大写字母开头——它使意图更清晰,并且使阴影(例如在我之前的示例中)的可能性大大降低。
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
正如布赖恩建议的那样
结束编辑
注意:我在下面尝试了这个代码,但我确实找到了一个更好的算法来解决它。
f# - 带有活动模式的 FizzBuzz
我试图理解活动模式,所以我在玩 FizzBuzz:
这基本上是正确的方法,还是有更好的方法在这里使用活动模式?我不应该能够findMatch
使用 int 而不是 int 选项吗?
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
编辑:这是一个更简单的复制:
f# - 结合类型测试和文字的模式
此问题中的活动模式在升级到 VS 2012 RTM 后无法编译。它提供了一种进行类型测试并匹配单个模式中的文字的方法。例如:
这可以在没有活动模式的情况下完成吗?我意识到when
可以使用警卫 ( :? string as s when s = ""
) 但它不能与其他模式结合使用。
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 中的参数替换为分解它的函数?
f# - 在有区别的联合类型声明中使用活动模式
是否可以在有区别的联合类型声明中使用活动模式?
更准确地说,考虑以下玩具示例:
现在假设我想覆盖 T 中的 ToString()。在 T 的类型声明中,我不能引用 T_ToString,因为此时尚未声明 T_ToString。我无法在 ToString() 之前移动活动模式和 T_ToString ,因为此时尚未声明 T 。但这也不起作用:
f# - FSharp 活动模式的问题
我正在解析 FSharp 中的代码引用并正在构建模式助手。一切都很顺利,直到我尝试
目的是有一个通用的二进制函数匹配器,它返回“左”和“右”,然后创建专门的二进制匹配器,例如多重、除法和加减法。
但是我在第二种模式上遇到错误
有人可以告诉我我应该在这里做什么吗?
f# - F# 部分主动模式匹配“规则永远不会被匹配”
给定以下活动模式:
以及以下模式匹配函数:
最后一行的通配符模式说warning FS0026: This rule will never be matched
我看到的所有示例似乎都推断出部分活动模式必须返回Some('a)
以匹配,并且返回的模式None
被通配符捕获。错误似乎有不同的说法。
我错过了什么?
f# - 与 AND 模式不完全匹配
我在 F# 中定义了一个表达式树结构,如下所示:
我希望能够漂亮地打印表达式树,所以我做了以下事情:
但是,我不太喜欢failwith
该函数的方法,operator
因为它不是编译时安全的。所以我将它重写为一个活动模式:
现在我可以format
漂亮地重写我的函数如下:
我假设,因为 F# 很神奇,所以这会起作用。不幸的是,编译器会警告我不完整的模式匹配,因为它看不到任何匹配的东西Unary(x)
也会匹配Operator(op)
,任何匹配的东西Binary(x, y)
也会匹配Operator(op)
。而且我认为这样的警告与编译器错误一样糟糕。
所以我的问题是:是否有特定的原因导致这不起作用(比如我是否在某处留下了一些神奇的注释,或者有什么我没有看到的东西)?是否有一个简单的解决方法可以用来获得我想要的安全类型?这种类型的编译时检查是否存在固有问题,还是 F# 可能会在将来的某个版本中添加?