当前位置: 首页 > 知识库问答 >
问题:

Haskell模式与防护器匹配

漆雕和昶
2023-03-14

假设我想在Haskell中用

data Tree = Null | Node Tree Integer Tree deriving Show
isSmall :: Tree -> Bool
isSmall _ 
  | Null = True
  | (Node a b c) = if b >= 10
                   then False
                   else isSmall a && isSmall c

错误:

test.hs:24:6: Not in scope: data constructor ‘Node’

test.hs:24:11: Not in scope: ‘a’

test.hs:24:13: Not in scope: ‘b’

test.hs:24:15: Not in scope: ‘c’

test.hs:24:27: Not in scope: ‘b’

test.hs:26:38: Not in scope: ‘a’

test.hs:26:57: Not in scope: ‘c’

共有1个答案

陆才俊
2023-03-14

这不是在Haskell中应该做的模式匹配吗?

不。守卫是布尔表达式,不是模式。

可以这样进行模式匹配:

isSmall :: Tree -> Bool
isSmall Null = True
isSmall (Node a b c) = b < 10 && isSmall a && isSmall c
isSmall :: Tree -> Bool
isSmall x = case x of
  Null -> True
  Node a b c -> b < 10 && isSmall a && isSmall c
{-# LANGUAGE LambdaCase #-}

isSmall :: Tree -> Bool
isSmall = \case
  Null -> True
  Node a b c -> b < 10 && isSmall a && isSmall c

也就是说,可以使用<-在guards中嵌入模式。这就是所谓的“模式卫士”:

isSmall :: Tree -> Bool
isSmall x 
  | Null <- x = True
  | Node a b c <- x = b < 10 && isSmall a && isSmall c

然而,这种语法在这里并不为您买多少东西。您仍然必须为参数指定一个名称(在本例中为x),并且必须在任何地方显式地表示<-x。直接使用模式匹配(使用case或多函数方程)会更清楚。

 类似资料:
  • 我正在学习函数式编程的入门课程,其中我们使用Haskell。练习的一部分是为输入字符串编写解析器。 然而,我无法解决以下错误,或者得到实际发生的事情。 错误来自这一行: 我期望发生的是,输入字符串被拆分成一个行列表,并传递给parseTrack。然后,parseTrack将使用模式匹配来命名列表中最前面的两个字符串(行)和其他字符串。 然而,我认为正在发生的是finish是列表中的顶部元素,sta

  • 这是一个示例文本:。我无法修改输入文本,我正在从文件中读取长字符串文本。 我想提取以下内容:,,, 为此,我编写了以下正则表达式模式: 我正在使用和类,但是我的Matcher无法使用前面提到的正则表达式找到模式。我在一些在线regex网站上用文本测试了这个regex,令人惊讶的是,它在那里工作。 我哪里做错了? 原始代码: 输出:未打印任何内容

  • 防护端管理是指对Agent端的管理,针对Agent端规则配置、状态查看、授权管理、IP黑白名单查看及设置等。 防护清单 基础防护 高级防护 访问控制策略(堡垒锁/监测器) 防护清单 展示管理所有安装网防G01的服务器,包括服务器IP、操作系统、在线离线情况、归属运维单位等。 基础防护 基础防护功能为安装网防G01后即可使用的安全防护功能。基础防护功能包括: 应用防护管理 应用防护 网站漏洞防护 网

  • 问题内容: 如何找到具有匹配模式的所有键的计数。 例如,有两个键和。常见的模式是。因此,这里的计数是2。 如何在Redis中做到这一点? 问题答案: 免责声明 我希望这个旧答案不会损坏任何具有数百万把钥匙的生产系统。如果出于某种原因仍要在生产中仍然计算redis的匹配键,最好使用具有匹配模式的scan。 如果仅使用KEYS进行搜索,并使用Redis客户端,您将获得所有匹配密钥的数字列表,对吗? 例

  • 我试图编写函数尾部,它将字符串转换成字符串列表,方式如下: 以下是我的实现: 正如标题所暗示的,这个函数中有一些非详尽的模式。不幸的是,我不明白为什么。 我是哈斯克尔的新手。。。任何帮助都将不胜感激!