gpt4 book ai didi

wolfram-mathematica - 替换规则中带有可选参数的模式

转载 作者:行者123 更新时间:2023-12-04 08:03:58 24 4
gpt4 key购买 nike

我正在尝试使用可选参数 color_RGBColor 定义替换规则应替换为 Sequence[]当它在原始表达式中不存在时:

style[line_Line, ___, 
color_RGBColor: Unevaluated@Sequence[], ___] :> {color, line}

RGBColor存在于原始表达式中,规则有效:
style[Line[], RGBColor[{}]] /. 
style[line_Line, ___,
color_RGBColor: Unevaluated@Sequence[], ___] :> {color, line}

=> {RGBColor[{}], Line[]}

但是当它不存在时,它不会:
style[Line[], Thickness[0.01]] /. 
Style[line_Line, ___,
color_RGBColor: Unevaluated@Sequence[], ___] :> {color, line}

=> style[Line[], Thickness[0.01]]

我的问题是:

1)为什么它不起作用?

2)是否可以构建一个可以按需要工作的单一模式?

最佳答案

您的模式不起作用,因为模式匹配适用于默认(可选)参数的方式,还因为您将头部限制为 RGBColor .问题是默认参数值必须匹配模式,而 Unevaluated[Sequence[]]肯定不匹配_RGBColor .

你有几种出路。第一个尝试是削弱您的类型检查:

In[10]:= style[Line[],Thickness[0.01]]/.
style[line_Line,___,color_: Unevaluated@Sequence[],___]:>{color,line}

Out[10]= {Thickness[0.01],Line[]}

但这不起作用,因为匹配不正确 - 打字确实太弱了。让它工作的hacky方法是这样的:
In[14]:= style[Line[], RGBColor[{}]] /. 
style[line_Line, ___, color : (_RGBColor | _Unevaluated) :
Unevaluated@Sequence[], ___] :> {Evaluate@color, line}


Out[14]= {RGBColor[{}], Line[]}

In[15]:= style[Line[], Thickness[0.01]] /.
style[line_Line, ___, color : (_RGBColor | _Unevaluated) :
Unevaluated@Sequence[], ___] :> {Evaluate@color, line}

Out[15]= {Line[]}

推荐的方法是这样的:
In[18]:= style[Line[], Thickness[0.01]] /. 
style[line_Line, ___, color : (_RGBColor | Automatic) : Automatic, ___] :>
If[color === Automatic, {line}, {color, line}]


Out[18]= {Line[]}

In[17]:= style[Line[], RGBColor[{}]] /.
style[line_Line, ___, color : (_RGBColor | Automatic) : Automatic, ___] :>
If[color === Automatic, {line}, {color, line}]


Out[17]= {RGBColor[{}], Line[]}

模式匹配器的这个特性并不是很广为人知,所以我再强调一下:(可选)模式的默认值 x:ptrn:default必须匹配 ptrn .有关此类行为的另一个示例,请参阅 this数学组讨论。

关于wolfram-mathematica - 替换规则中带有可选参数的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6401255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com