gpt4 book ai didi

haskell - 案例表达式/列表推导中的模式匹配

转载 作者:行者123 更新时间:2023-12-01 09:23:46 24 4
gpt4 key购买 nike

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

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

数据类型:

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')

不是。

Strangley 显式匹配有效:

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
复合(原子'b')(原子'c')

>: subs''' subList term1>: subs''' subList term2
原子'x'

我错过了什么?

最佳答案

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

这里的内部 c 只是一个新变量,它会影响外部 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)

关于haskell - 案例表达式/列表推导中的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29029683/

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