если у меня что-то подобное:
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` []
я получу: False (должно быть True).
это потому, что первый шаблон имеет в своем правом элементе: (x:xs)
, и из-за этого x
ДОЛЖЕН быть со значением, поэтому я прохожу через первый шаблон и перехожу ко второму шаблону:
list `myIsPrefixOf` [] = False
, которые совпадают, и возвращают False.
я прав?
если я прав, то разница в том, что если я напишу (x:xs)
, x
ДОЛЖНО быть значением, а НЕ []
.
с другой стороны, если я напишу list
, он может совпадать с []
и [a]
и [a,a,a]
(и т. д.), и из-за этого list
второго шаблона будет соответствовать первый []
в моем вводе, и поэтому я получу False?
(как и раньше, в [a]
я имею в виду, что это список с одним номером, а [a,a,a]
- это список из трех чисел).
также, чтобы исправить эту ситуацию, мне нужно заменить:
[] <code>myIsPrefixOf</code> (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
)
ну, я все понимаю, хорошо? : -)
Большое спасибо: -).