Как исправить «Неисчерпывающие паттерны в функции» - PullRequest
0 голосов
/ 14 июня 2019

Я хочу передать список в качестве параметра функции, которая умножит каждый элемент этого списка на 3. Я должен использовать рекурсию (я знаю, как это сделать) и функцию карты (есть проблема).

Я пытаюсь передать список в качестве параметра, как я видел в других сообщениях, но он не работает.

fun x = 3 * x + 1
mult :: [Int] -> [Int]
mult [a] = map fun [a]

Код, который я пробовал, показывает: Исключение: x: неисчерпывающие шаблоны вфункция мульт

Ответы [ 2 ]

6 голосов
/ 14 июня 2019

[a] - это одноэлементный список - список, содержащий только один элемент, a.

Как таковой map f [a] == [f a] и ваше определение эквивалентно

mult :: [Int] -> [Int]
mult [a] = [fun a]

[a] эквивалентно (a : []) и как выражение (то, что появляется справа от =), или как образец (слева от =).

(a : []) - это модель, которая выражает это tail (a : []) == []. Таким образом, любой список с ненулевым хвостом не будет соответствовать этому шаблону. Любой пустой список также не будет ему соответствовать.

Это случаи, когда ваш код не обрабатывает. Отсюда и ошибка «неисчерпывающей обработки шаблонов».

Исчерпывающая пара шаблонов сопоставления списков: [] и (a : as). Один для пустых списков, а другой для непустых списков с элементом head a и tail as.

0 голосов
/ 14 июня 2019

Решение:

fun x = 3 * x + 1
mult :: [Int] -> [Int]
mult (x:xs) = map fun (x:xs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...