如何在Haskell中与代数类型进行模式匹配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Haskell中与代数类型进行模式匹配相关的知识,希望对你有一定的参考价值。

我正在处理的赋值的目标是创建一组不同的函数,涉及搜索称为Trie的数据类型,其中构造函数被定义为

data Trie = MakeTrie Char [Trie] deriving Eq

我想要首先构建简单的函数,以便我可以弄清楚如何下降这个Trie,但似乎模式匹配不起作用。

test :: Trie -> Bool
test t
    | t == MakeTrie '.' [_] = True
    | otherwise = False

我得到一个错误,说明找到了一个洞,相关的绑定包括t :: Trie。我怎样才能让翻译知道[_]表示试验列表?我这样做的原因是因为我不知道如果我不使用模式匹配,如何继续下载我的Trie。

答案

您应该在Learn You A Haskell中查看function syntax chapter(特别是关于模式匹配的第一部分)。

这是你在Haskell中为这个例子进行模式匹配的方法:

test :: Trie -> Bool
test (MakeTrie '.' _) = True
test _ = False

测试:

Prelude> test (MakeTrie '.' [])
True
Prelude> test (MakeTrie 'a' [])
False
另一答案

这里有两个问题:

  1. 如果你写[_],这是一个模式,表示“一个元素的列表,无论该元素是什么”;和
  2. 你不能与(==)进行模式匹配。

确实(==)是一个比较两个对象的函数。但是并不是说如果两个对象相等,它们共享相同的构造函数,等等.(==)可以实现任意的等价关系。

我们可以把函数写成:

test :: Trie -> Bool
test (MakeTrie '.' _) = True
test _ = False

所以这里第一个子句检查输入是否匹配模式MakeTrie '.' _,所以它检查它是否是MakeTrie数据构造函数,其中第一个参数是'.',第二个参数可以是任何东西。

第二个子句匹配所有内容,并在这种情况下返回False

以上是关于如何在Haskell中与代数类型进行模式匹配的主要内容,如果未能解决你的问题,请参考以下文章

Haskell:绑定模式匹配的地方

Haskell代码编程

你如何在 Haskell 中使用模式匹配和元组列表?

Haskell:为什么++不允许模式匹配?

函数返回与函数参数中的 Haskell 模式匹配

在 Haskell 中推导是如何工作的?