2014-03-22 2 views
3

Я пытаюсь использовать последовательности для повышения производительности. При определении функции ниже я попытался использовать операторы «треугольника» в контексте паттерна шаблонов.Как использовать операторы треугольника в функции соответствия шаблону

import qualified Data.Sequence as S 

cleanField :: S.Seq Char -> S.Seq Char 
cleanField ((S.<|) ' ' xs) = cleanField xs 
cleanField ((S.|>) xs ' ') = cleanField xs 
cleanField xs = xs 

GHC 7.4.1 говорит:

seq.hs:4:13: Parse error in pattern: (S.<|) 

Могу ли я не использовать операторы треугольника (<|, |>) в сопоставлении с образцом?

Если да, то почему я могу использовать cons (:) оператора в сопоставлении с образцом, а не в операторах треугольника?

+4

Я не знаком с этим модулем, но, возможно, '<|' и другие не являются конструкторами, не так ли? Вы можете использовать ':' в шаблоне, потому что это конструктор. –

+0

@XavierPinho Они кажутся [конструкторами] (http://hackage.haskell.org/package/containers-0.5.5.1/docs/Data-Sequence.html#g:1) –

ответ

8

Xavier Pinho является правильным. Операторы (<|) и (|>) являются обычными функциями, но в шаблонах могут использоваться только конструкторы данных. (Да, они перечислены в документации под названием Строительство, потому что они используются для построения последовательностей из компонентов, но они не технически конструкторов данных.)

библиотека предлагает две функции viewl и viewr для создания элементов datatypes ViewL и ViewR. Они имеют конструкторы :< и :>, которые могут быть сопоставлены.

Пример:

s :: Seq Int 
s = fromList [1,2,3] 

test1 :: (Int, Seq Int) 
test1 = case viewl s of 
      x :< xs -> (x, xs) 

test2 :: (Seq Int, Int) 
test2 = case viewr s of 
      xs :> x -> (xs, x) 

Представления также удобны для использования с расширением на ViewPatterns языке. Если включено, вы можете сказать

test3 :: Seq Int -> (Int, Seq Int) 
test3 (viewl -> x :< xs) = (x, xs) 

для соответствия входящей последовательности, как если бы это был список.

+0

Так много узнать, спасибо за разъяснение! –

7

Вы можете сопоставлять шаблоны только конструкторам и инфикс-конструкторам в Haskell, чтобы начать с двоеточия. Таким образом, эти треугольные операторы являются нормальными функциями, : - это конструктор списка.

Для проверки одного из концов Sequence вы можете использовать функции viewl и viewr. Они возвращают ViewL и ViewR соответственно, и эти типы также имеют треугольные операторы в качестве конструкторов. Вы можете использовать их следующим образом с защитой шаблонов.

cleanField xs 
    | ' ' S.:< rest <- S.viewl xs = cleanField rest 
    | rest S.:> ' ' <- S.viewr xs = cleanField rest 
    | otherwise     = xs 
+1

Является ли начало с двоеточия (' : ') вещь, которое принудительное языковое правило компилятора или исполнитель принуждает к языковому соглашению? –

+3

@awashburn Это часть языка. Компилятор рассматривает все строчные или нормальные символические имена как переменные в шаблонах, а также прописные или символические имена с начальным конструктором ':' в качестве конструкторов данных. У вас есть ошибка, потому что вы использовали квалифицированное имя переменной, которое является незаконным в шаблоне. – kosmikus

 Смежные вопросы

  • Нет связанных вопросов^_^