我正在处理的赋值的目标是创建一组不同的函数,这些函数涉及搜索称为Trie的数据类型,其中构造函数被定义为
data Trie = MakeTrie Char [Trie] deriving Eq
我想要首先构建简单的函数,以便我可以弄清楚如何下降这个Trie,但似乎模式匹配不起作用。
test :: Trie -> Bool
test t
| t == MakeTrie '.' [_] = True
| otherwise = False
我收到一条错误,说明找到了一个洞,相关的绑定包括t :: Trie。我怎样才能让翻译知道[_]表示试验列表?我这样做的原因是因为如果我不使用模式匹配,我不知道如何继续下载我的Trie。
答案 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)
这里有两个问题:
[_]
,这是一种模式,表示“一个元素的列表,无论该元素是什么”;和(==)
进行模式匹配。确实(==)
是一个比较两个对象的函数。但是并不是说如果两个对象相等,它们共享相同的构造函数,等等。(==)
可以实现任意等价关系。
我们可以将函数编写为:
test :: Trie -> Bool
test (MakeTrie '.' _) = True
test _ = False
所以这里第一个子句检查输入是否与模式MakeTrie '.' _
匹配,因此它检查它是MakeTrie
数据构造函数,其中第一个参数是'.'
,第二个参数什么都可以。
第二个子句匹配所有内容,在这种情况下返回False
。