2015-08-26 2 views
1

мне нужно запрограммировать функцию split с помощью foldrSplit с foldr в Haskell

split :: Eq a ⇒ a → [a] → [[ a ]] 

Примеры:

split '/' ”hello/my/friends” ----> [”hello”,”my”,”friends”] 

Вот что я пытался:

split :: Eq a ⇒ a → [a] → [[ a ]] 
split str delim = let (start, end) = break (== delim) str 
       in start : if null end then [] else groupBy (tail end) delim 
+0

Не могли бы вы опубликовать любые попытки вы сделали до сих пор? С какой частью вы испытываете трудности? – ryachza

+0

все, я не знаю, программирование этой функции. –

+1

@christianrusso Зачем вам нужно выражать это как 'foldr', и является ли это трудностью? Можете ли вы написать 'split' другим способом? – ryachza

ответ

4

Нечто подобное должен работать:

foldr (\c (x:xs) -> 
    if c == '/' 
    then "":x:xs 
    else (c:x):xs 
) [""] "hello/my/friends" 

Обобщенная:

split on = foldr (\c (x:xs) -> 
    if c == on 
    then []:x:xs 
    else (c:x):xs 
) [[]] 
+0

Я использую эту функцию split :: Eq a => a -> [a] -> [[a]] , И у меня есть следующая ошибка: Не удалось совместить тип 'a' с 'Char' –

+0

'(c: x): xs' не работает. 'c: x' будет иметь тип' [a] ', но': xs' ожидает тип 'a'. Левая ассоциативность с '(:)' никогда не работает. – Kwarrtz

+1

@Kwarrtz кроме этого *. * Работа. Он заключен в скобки. Вы * хотите * 'c: x' быть типа' [a] '. 'xs' имеет тип' [[a]] '. – ryachza

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