/ / Problemy z definicją SplitOneOf w Haskell - haskell

Problemy z definicją Haskell SplitOneOf - haskell

Cześć chłopaki :D wróć z kolejnym pytaniem Haskella tutaj. Ćwiczę więc do mojego egzaminu końcowego i robiłem ćwiczenie z poprzednich egzaminów i zasadniczo dzielę funkcję, jeśli się nie mylę, chcę stworzyć funkcję, która po wykryciu jednej z danej listy znaków usuwa je z innej listy i zwraca listę ciągów, z których dzieli.

To, co do tej pory mam, a to niewiele, bo to nie działa, to to

sep :: Eq a => [a] -> [a] -> [[a]]
sep _ [] = []
sep n xs
| n `elem` xs = ... (I had stuff in here, didn"t put for sake of it being easier to understand where I"m at trouble)
| otherwise = error "Error"

W rezultacie chciałbym to:

ghci> sep " tn" "As armastetos barõesn   que"
**> ["As","armas","e","os","barões","que"]

EDYCJA: Po przetestowaniu pomocy, którą mi dałeś, pojawia się błąd, oto co mam:

sep :: Eq a => [a] -> [a] -> [[a]]
sep _ [] = []
sep n (x:xs)
| x `elem` n = " " ++ sep n xs
| otherwise  = x : sep n xs

I daje mi następujący błąd:

Couldn"t match type "Char" with "[a]"
Expected type: [[a]]
Actual type: [Char]
In the expression: " " ++ sep n xs

Couldn"t match type "[a]" with "Char"
Expected type: [Char]
Actual type: [[a]]
In the second argument of ´(++)´, namely ´sep n xs´

Odpowiedzi:

2 dla odpowiedzi № 1

Kiedy porównujemy listy lub w tym przypadku, jak rozumiem, porównujemy ciągi, jest kilka rzeczy, które musimy zrozumieć. Nie możemy sprawdzić, czy coś jest typu [a] jest elementem innego rodzaju [a]. Możemy je porównać, ale nigdy nie możemy porównać elementów, wymuszając na sobie całą listę.

[a] `elem` [a] // makes no sense
a  `elem` [a] // is what we are looking for.

Oczyszczenie sznurka jest łatwe, jednym ze sposobów jestzamień wszystkie elementy spełniające określone wymagania na coś innego. W takim przypadku możemy zastąpić wszystkie elementy spacją i możemy zastosować funkcję preludium words na wynik.

sep :: String -> String -> String
sep _ [] = []
sep s1 (s:ss) | s `elem` s1 = " " ++ sep s1 ss
| otherwise   =   s : sep s1 ss

A potem możemy oczywiście uczynić go nieco większym haskellem, łącząc go z niektórymi wysokowydajnymi funkcjami haskell.

sep2 :: String -> String -> [String]
sep2 s1 s2 = words $ map(x -> if (x `elem` s1) then " " else x) s2