Итак, я хотел попробовать сделать эту функцию сам (умножает все в списке на 3 и возвращает новый список):
list = [1,2,3,4,5,6,7,8,9,10]
list2 = [3 * x | x <- list]
И мне удалось получить это с помощью охранников (в основном это останавливается, когдах достигает границы списка):
tripleMultList :: [Int] -> Int -> [Int]
tripleMultList lst x
| null lst = []
| length lst - 1 == x = (lst !! x * 3) : []
| otherwise = (lst !! x * 3) : tripleMultList lst (x + 1)
Тогда я решил попробовать сделать это с сопоставлением с образцом:
tripleMultList :: [Int] -> Int -> [Int]
tripleMultList [] x = []
tripleMultList [y] x | x == (length [y] - 1) = [y] !! x : []
tripleMultList [y] x = [y] !! x : tripleMultList [y] (x + 1)
Но всякий раз, когда я пытался запустить эту функцию, яполучит неисчерпывающую ошибку сопоставления с образцом, поэтому я проверил ghci -Wall и он сказал, что мне нужен шаблон, сопоставленный с
(_:_:_) _
, который, как я предполагаю, примет форму
tripleMultList (_:_:_) _ = something
Я знаю, что
(_:_:_)
имеет отношение к выбору элементов из списка и отделению их от самого списка, хотя я понятия не имею, почему это применимо к моей функции.Я также не знаю, что означает «_» и как это относится к моей функции.
Поэтому я предполагаю, что мой вопрос заключается в том, что означает этот шаблон и зачем он мне нужен, когда у меня примерното же самое в версии моей функции, которая использует охрану, и что работает нормально?