如何在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
另一答案
这里有两个问题:
- 如果你写
[_]
,这是一个模式,表示“一个元素的列表,无论该元素是什么”;和 - 你不能与
(==)
进行模式匹配。
确实(==)
是一个比较两个对象的函数。但是并不是说如果两个对象相等,它们共享相同的构造函数,等等.(==)
可以实现任意的等价关系。
我们可以把函数写成:
test :: Trie -> Bool
test (MakeTrie '.' _) = True
test _ = False
所以这里第一个子句检查输入是否匹配模式MakeTrie '.' _
,所以它检查它是否是MakeTrie
数据构造函数,其中第一个参数是'.'
,第二个参数可以是任何东西。
第二个子句匹配所有内容,并在这种情况下返回False
。
以上是关于如何在Haskell中与代数类型进行模式匹配的主要内容,如果未能解决你的问题,请参考以下文章