Да. Только с буквальными значениями Int
; рекурсивно.
-- Using pattern matching alone
g :: [Int] -> Int
g (42:_) = 42
g [] = 0
g (_:r) = g r
Тестирование:
> g [1..50]
42
> g [1]
0
Хотя в шаблонах нет регулярных конструкций. Я бы sh мог бы написать что-то вроде
foo [...xs, 42, ...ys] = xs ++ ys
foo _ = []
, но мы не можем.
Обновление: после предложения @ chi в комментарии ; используя просмотр шаблонов ;
{-# LANGUAGE ViewPatterns #-}
g2 (break (== 42) -> (_,[])) = 0 -- 0, if not found
g2 _ = 42 -- 42, otherwise
Я не уверен, считается ли он «только шаблонами», поскольку он использует «обычную» стандартную функцию, break
. Преимущество в том, что это больше не только с литералами.