如果我有这样的事情:
func (x1:x2:x3:xs) = xs
那么x1,x2,x3
必须存在,是吗?
它们不能是[]
,但必须(再次,必须)具有价值,是吗?
另外,xs
可以是[]
或[a]
或[a,a,a]
(等),是吗?
([a]
我的意思是它是一个带有一个数字的列表,并且[a,a,a]
是三个数字的列表)。
我也有定义 isPrefixOf 的函数:
myIsPrefixOf :: (Eq a) => [a] -> [a] -> Bool
[] `myIsPrefixOf` [] = True
[] `myIsPrefixOf` (x:xs) = True
list `myIsPrefixOf` [] = False
(l:ls) `myIsPrefixOf` (x:xs) = if l == x then ls `myIsPrefixOf` xs
else False
如果我删除第一个模式,该函数将如下所示:
myIsPrefixOf :: (Eq a) => [a] -> [a] -> Bool
[] `myIsPrefixOf` (x:xs) = True
list `myIsPrefixOf` [] = False
(l:ls) `myIsPrefixOf` (x:xs) = if l == x then ls `myIsPrefixOf` xs
else False
现在我会写:
[] `myIsPrefixOf` []
我会得到:假(应该是真)。
是不是因为第一个模式在他的右侧元素中有: (x:xs)
,正因为如此,x
必须有一个值,因此我通过第一个模式,并到达第二个模式:
list `myIsPrefixOf` [] = False
匹配,并返回 False。
我对吗?
如果我是对的,那么不同的是,如果我写(x:xs)
, x
必须是一个值而不是[]
。
另一方面,如果我写list
,它可以匹配[]
and [a]
and [a,a,a]
(etc'),因此,list
第二个模式将匹配 []
我输入中的第一个,因此我会得到 False?
(和以前一样,[a]
我的意思是它是一个带有一个数字的列表,并且[a,a,a]
是三个数字的列表)。
另外,为了纠正这种情况,我需要更换:
[] myIsPrefixOf
(x:xs) = True
接着就,随即:
[] `myIsPrefixOf` list = True
现在是表达式:
[] `myIsPrefixOf` []
[] `myIsPrefixOf` [1,2,3]
将再次匹配:
[] `myIsPrefixOf` list = True
希望我在这些事情上是对的,现在是另一个问题:
这是从一开始的固定功能(应用更改后)
myIsPrefixOf :: (Eq a) => [a] -> [a] -> Bool
[] `myIsPrefixOf` list = True
list `myIsPrefixOf` [] = False
(l:ls) `myIsPrefixOf` (x:xs) = if l == x then ls `myIsPrefixOf` xs
else False
现在,如果我删除第二个模式匹配,该函数将如下所示:
myIsPrefixOf :: (Eq a) => [a] -> [a] -> Bool
[] `myIsPrefixOf` list = True
(l:ls) `myIsPrefixOf` (x:xs) = if l == x then ls `myIsPrefixOf` xs
else False
并像这样调用函数:
[1,2] `myIsPrefixOf` [1]
我收到一个错误,说函数中没有详尽的模式。
我想看看我是否明白为什么会这样。
该函数通过第一个模式并到达第二个模式:
(l:ls) `myIsPrefixOf` (x:xs) = if l == x then ls `myIsPrefixOf` xs
else False
所以:
[1,2] `myIsPrefixOf` [1]
和:
l == x
。
他们俩1
,所以我再次匹配第二个模式:
(2:[]) `myIsPrefixOf` ([]:[])
现在, l == 2
, 但是x == []
因为这样,表达式:l == x
返回不详尽的模式...
是因为我试图检查数字和列表之间的相等性吗?
相等参数(==)应该只检查相同类型的元素吗?
(即:'a' == 'b'
或1 == 3
)
好吧,我明白了吗?:-)
非常感谢:-)。