案例表达/列表理解中的模式匹配

朱尔斯

为什么以下尝试在列表理解中进行模式匹配不起作用?

示例:同时替换术语数据类型中的原子。

数据类型:

data Term a 
    = Atom a
    | Compound (Term a) (Term a)
    deriving Show

用原子来表示原子的替换算法(如果有匹配则选择第一个匹配替换,然后忽略其余匹配):

subs :: [(Term a, Term a)] -> Term a -> Term a
subs subList term = case term of 
    atom@(Atom x)       ->  let substitutions = 
                                [ s | s@(Atom x, _) <- subList ]
                            in  if null substitutions
                                then atom
                                else snd . head $ substitutions
    (Compound t1 t2)    -> Compound (subs subList t1) (subs subList t2)

一些测试数据:

subList = [((Atom 'a'), Compound (Atom 'b') (Atom 'c'))]
term1 = Atom 'a' 
term2 = Atom 'x' 

运行示例将导致:

>: subs subList term1
Compound (Atom 'b') (Atom 'c')

这是理想的行为,并且

>: subs subList term2
Compound (Atom 'b') (Atom 'c')

不是。

粗暴的显式匹配工作原理:

subs'' :: [(Term Char, Term Char)] -> Term Char -> Term Char
subs'' subList term = case term of 
    atom@(Atom _)       ->  let substitutions = 
                            [ s | s@(Atom 'a', _) <- subList ]
                            in  if null substitutions
                                then atom
                                else snd . head $ substitutions
    (Compound t1 t2)    -> Compound (subs subList t1) (subs subList t2)

subs''' subList term = case term of 
     atom@(Atom _)       ->  let substitutions = 
                             [ s | s@(Atom 'x', _) <- subList ]
                             in  if null substitutions
                                 then atom
                                 else snd . head $ substitutions
     (Compound t1 t2)    -> Compound (subs subList t1) (subs subList t2)

将测试数据输入以下内容:

>: subs'' subList term1 或者 >: subs'' subList term2
Compound (Atom 'b') (Atom 'c')

>: subs''' subList term1 或者 >: subs''' subList term2
Atom 'x'

我想念什么?

安德拉斯·科瓦奇斯(AndrásKovács)

Haskell具有线性模式,这意味着模式中不得有重复的变量。同样,内部表达式中的模式变量会遮盖外部变量,而不是建立相同变量的相等性。

您正在尝试执行以下操作:

charEq :: Char -> Char -> Bool
charEq c c = True
charEq _ _ = False

但是由于重复的变量,这是一个错误。如果我们将第二个c移到内部表达式,它会编译,但仍无法按预期工作:

charEq :: Char -> Char -> Bool
charEq c d = case d of
  c -> True
  _ -> False

这里的innerc只是一个新的变量,它遮蔽了外部c,因此charEq总是返回True

如果我们想检查是否相等,则必须==显式使用

subs :: [(Term a, Term a)] -> Term a -> Term a
subs subList term = case term of 
    atom@(Atom x)       ->  let substitutions = 
                                [ s | s@(Atom x', _) <- subList, x == x' ]
                            in  if null substitutions
                                then atom
                                else snd . head $ substitutions
    (Compound t1 t2)    -> Compound (subs subList t1) (subs subList t2)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

模式匹配Scala中的案例类列表

来自分类Dev

在模式匹配中获取默认案例的类型

来自分类Dev

模式匹配::案例类

来自分类Dev

列表模式匹配添加基于案例对象的过滤

来自分类Dev

模式匹配SML中的列表

来自分类Dev

序言:列表中的模式匹配

来自分类Dev

Rascal 中的列表模式匹配

来自分类Dev

如何在单个项目存在的列表理解中减少模式匹配的样板

来自分类Dev

从列表理解中获取匹配的子列表

来自分类Dev

从列表理解中获取匹配的子列表

来自分类Dev

Scala中列表列表的模式匹配

来自分类Dev

Scala模式匹配嵌套案例

来自分类Dev

.NET对象列表中的正则表达式样式模式匹配

来自分类Dev

R-在用户函数中获取与正则表达式模式匹配的表的列表

来自分类Dev

Scala-在模式匹配表达式中扩展参数列表

来自分类Dev

.NET对象列表中的正则表达式样式模式匹配

来自分类Dev

捕获匹配点在列表中的理解

来自分类Dev

列表中的Elixir模式匹配头

来自分类Dev

Haskell中的空列表的模式匹配

来自分类Dev

如何对列表中的元素使用模式匹配?

来自分类Dev

在列表中存储模式匹配的索引

来自分类Dev

当所需的模式存储在变量中时,为什么“匹配?”会减少其匹配案例?

来自分类Dev

在R中,使用正则表达式匹配多个模式并在列表中添加新列

来自分类Dev

如何在Scala中理解“与Singleton对象的模式匹配”?

来自分类Dev

如何获得在Java中的正则表达式模式字符串列表和匹配字符串

来自分类Dev

使用案例与函数进行模式匹配

来自分类Dev

大/长案例类别上的模式匹配

来自分类Dev

Scala中非案例类的模式匹配

来自分类Dev

Scala中非案例类的模式匹配

Related 相关文章

热门标签

归档