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

时间:2018-03-04 17:23:12

标签: haskell functional-programming

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

data Trie = MakeTrie Char [Trie] deriving Eq

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

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

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

2 个答案:

答案 0 :(得分:4)

你应该查看了解你的Haskell 中的function syntax chapter(特别是关于模式匹配的第一部分)。

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

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

测试:

Prelude> test (MakeTrie '.' [])
True
Prelude> test (MakeTrie 'a' [])
False

答案 1 :(得分:3)

这里有两个问题:

  1. 如果您编写[_],这是一种模式,表示“一个元素的列表,无论该元素是什么”;和
  2. 您无法与(==)进行模式匹配。
  3. 确实(==)是一个比较两个对象的函数。但是并不是说如果两个对象相等,它们共享相同的构造函数,等等。(==)可以实现任意等价关系。

    我们可以将函数编写为:

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

    所以这里第一个子句检查输入是否与模式MakeTrie '.' _匹配,因此它检查它是MakeTrie数据构造函数,其中第一个参数是'.',第二个参数什么都可以。

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