Как в Haskell использовать сопоставление с образцом в охранных выражениях (в конкретном примере)?
Сопоставление с образцом можно использовать, но в guard'ах надо явно указывать, что сопоставляем, т.е. в данном случае аргумент - listfoo :: Eq a ⇒ [a] → Bool
foo list
	| [] ← list = True
	| [x] ← list = True
	| head list ≡ last list = foo . tail . init $ list
	| otherwise = False
Хотя лично я предпочитаю исходный вариант.
В первом примере вы определили функцию и сопоставляете аргумент с образцом.
Во втором случае вы определили функцию с аргументом list и почему то думаете, что 
[x] компилятор воспримет как аргумент, ничего подобного. В гард-выражениях следует писать уже определенные идентификаторы