2013-02-28 2 views
2

Есть ли способ шаблона сопоставить любой список без итерации через два случая: пустой или непустой список?Соответствует любому списку в Haskell

Я хотел бы исправить следующий код:

foo [] = "something else" 
foo [_:_] = "something else" 

Поскольку часть в something else то же самое я хотел бы, чтобы удалить его из одного места.

спасибо.

+0

Первая строка 'foo x = something' соответствует любому списку. Что конкретно вы хотите сделать? – asm

+5

http://learnyouahaskell.com –

+1

Вы пытаетесь сопоставить, например, целые числа в вашей первой строке и списки в других строках? Это невозможно - какой будет тип функции foo? – us2012

ответ

8

Образец _ соответствует любому, не привязывая его к имени. Имя, как говорят, xs также соответствует чему угодно. Таким образом, вы можете сделать что-либо:

foo _ = "something else" или foo xs = "something else"

Если «что-то другое» действительно не зависит от величины xs первой формы является предпочтительным, так что другой программист (и вы) может быстро определить что это значение не имеет значения в этом конкретном уравнении.

К сожалению, ваш первый случай уже имеет вторую форму, поэтому он соответствует всем возможностям. Другие случаи никогда не будут достигнуты.

+0

. Я удалил часть «catch all». Извините –

+2

Кроме того, с '-Wall', GHC будет предупреждать об используемой переменной' xs', если вы укажете ее в заголовке шаблона. Подчеркивание не является переменной и поэтому не будет выдавать это предупреждение. – leftaroundabout

+3

И если по какой-то причине вы хотите дать игнорируемому параметру имя, 'foo _xs =" something else "' - начало имени с подчеркиванием предотвратит предупреждение неиспользуемой переменной. –