Я пытаюсь переопределить определение продукта в haskell.Я получаю сообщение об ошибке «Неисчерпывающие шаблоны в функции» - PullRequest
0 голосов
/ 08 октября 2018
product' :: [Integer] -> Integer
product' (x:xs)
  | (x:xs) == []   = 1
  | otherwise = x * (product' (xs))

Первый не работает и выдает ошибку.В приведенном ниже примере используется метод сопоставления с образцом, и он работает нормально.

productP :: [Integer] -> Integer
productP [] = 1
productP (x:xs) = x * (productP (xs))

1 Ответ

0 голосов
/ 08 октября 2018

Часть (x:xs) == [] не является бессмысленной: с (x:xs) you создается список, содержащий хотя бы один элемент: x в качестве первого элемента и xs в качестве (возможно, пустого)список оставшихся элементов.Следовательно, всегда приведет к False.

. Суть шаблона (x:xs) состоит в том, что он соответствует непустым спискам .Список определяется как:

data [a] = [] | (a:[a])  -- pseudo-code

Таким образом, список имеет два конструктора данных:

  1. пустой список []
  2. "минусы" (x:xs), имеющие голову x и хвост xs.x - это элемент списка, а xs - список оставшихся элементов.

Вы можете проверить, равен ли xs весь список пустому списку, изатем используйте head и tail:

product' :: [Integer] -> Integer
product' xs
  | xs == []  = 1
  | otherwise = head x * product' (tail xs)

Но вышеприведенное не очень элегантно, поскольку head и tail являются неполными функциями (хорошо, что они ошибочныдля пустых списков), таким образом, «сложнее» определить, что эта функция всегда будет давать ответ.

...