2015-08-26 85 views
1

foldr相似,我需要使用foldr拆分與哈斯克爾

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

實例編程功能split

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