Как в Haskell использовать сопоставление с образцом в охранных выражениях (в конкретном примере)?

Доброй ночи. Подскажите как использовать сопоставление с образцом в охранных выражениях.

Например, есть рабочий код:
isPalindrome'' :: Eq a => [a] -> Bool
isPalindrome'' [] = True
isPalindrome'' [x] = True
isPalindrome'' list
    | head list == last list = (isPalindrome' . tail . init) list
    | otherwise = False


Пытаюсь преобразовать код к виду:
isPalindrome''' :: Eq a => [a] -> Bool
isPalindrome''' list
    | [] = True
    | [x] = True
    | head list == last list = (isPalindrome' . tail . init) list
    | otherwise = False

Интерпретатор пишет, что 'x' не определен. Как можно это исправить ?
  • Вопрос задан
  • 2589 просмотров
Решения вопроса 1
Сопоставление с образцом можно использовать, но в guard'ах надо явно указывать, что сопоставляем, т.е. в данном случае аргумент - list

foo :: Eq a ⇒ [a] → Bool
foo list
	| [] ← list = True
	| [x] ← list = True
	| head list ≡ last list = foo . tail . init $ list
	| otherwise = False


Хотя лично я предпочитаю исходный вариант.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
begemot_sun
@begemot_sun
Программист в душе.
В первом примере вы определили функцию и сопоставляете аргумент с образцом.
Во втором случае вы определили функцию с аргументом list и почему то думаете, что
[x] компилятор воспримет как аргумент, ничего подобного. В гард-выражениях следует писать уже определенные идентификаторы
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы