2015-05-30 2 views
4

Как датьнесколько параметров функции

break (== ' ') xxs 

несколько логических параметров без изменения определения? Или это неизбежно. Например

break (== (' ' || '\t' || '\n')) xss 

foldl и foldr являются одним из способов, но здесь они не применимы, или, по крайней мере, я не был в состоянии использовать их.

+4

'break (flip elem" \ t \ n ")'? – Zeta

+0

Вы можете дать 'break' любую функцию для своего первого аргумента. Таким образом, вы можете просто создать новую функцию, которая является предикатом, который вы хотите, и передать его «break». –

+0

@Zeta Да, это работает, но не могли бы вы немного объяснить это? – user8

ответ

11

Это вы что искали?

break (\x -> x == ' ' || x == '\t' || x == '\n') xss 
+1

Этот ответ велик, потому что он находится прямо на уровне OP и открывает новый мир без чрезмерного расширения. – luqui

5

Ваш текущий вопрос на самом деле не о нескольких параметров, но разные предикаты для break. Рассмотрим тип break «S для второго:

break :: (a -> Bool) -> [a] -> ([a], [a]) 

Этот тип функции (a -> Bool) называется предикат. Вы можете использовать все, что использует правый a, и возвращает Bool. Вот почему ваш первый код typechecks:

ghci> :t (== ' ') 
(== ' ') :: Char -> Bool 

Теперь, если вы хотите использовать несколько символов в качестве возможных символов разрыва, вам нужно использовать другую Char -> Bool. Если символы фиксированы (и вы не имеете многие из них), вы можете использовать список [Char] и elem:

yourCharacters = [' ','\t','\n'] 

predicate :: Char -> Bool 
predicate c = c `elem` yourCharacters 

Мы можем использовать это в качестве предиката для break:

myBreak = break (`elem` yourCharacters) 

В этот пункт, вы можете также изменить myBreak так, что она принимает список символов, в какой момент вы получите:

myBreak' :: [Char] -> [Char] -> ([Char], [Char]) 
myBreak' limiters = break (`elem` limiters) 
-- myBreak' limiters str = break (`elem` limiters) str 

НТН

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