J'essaie de créer une fente de fonction pouvant prendre [int] et int class Split a where
split :: (Eq a) => [a] -> a -> [a]
instance Split [Char] Char where
split [] c = [""]
split (x:xs) c
| x == c = "" : (split xs c)
| otherwise = (x : head (split xs c)) : tail (split xs c)
instance Split [Int] Int where
split [] n = []
split (x:xs) n
| x == n = [] : (split xs n)
| otherwise = (x : head (split xs n)) : tail (split xs n)
4 Réponses :
Vous avez besoin d'une fonction polymorphe implémentation est simple p> divisée code>
L'axe est une faute de frappe de sous-remplacement
Exactement ce que je cherchais - merci beaucoup
Juste pour contribuer avec une autre approche. Cette solution utilise replier code>. Je pense que c'est assez propre mais moins incessible que @ Talex's
split :: (Eq a) => [a] -> a -> [[a]]
split l c = foldr f acc l
where acc = [[]]
f a t@(i@(x:_):xs) = if a == c then []:t else (a:i):xs -- Case when the current accumulator is not empty
-- | |- cons a to current accumulator
-- |- start a new accumulator
f a t@([]:xs) = if a == c then t else [a]:xs -- Case when the current accumulator is empty. Usefull when two separators are together
-- | |- cons a to current accumulator
-- |- Don't start a new accumulator, just continue with the current
juste une solution correcte.
split :: Eq a => [a] -> a -> [[a]] split xs delim = go $ dropWhile (== delim) xs where go [] = [] go xs = let (tok, rest) = break (== delim) xs in tok : go (dropWhile (== delim) rest)
Votre data.list.split.spliton code> (disponible à partir du package code> Split (code>) est proche:
Split :: EQ A => [A] -> A -> [[[[[A]] code> serait P>
split lst d = filter (not.null) $ splitOn [d] lst
N'utilisez pas de cours, écrivez simplement une fonction polymorphe avec le bon type par exemple.
Split :: (EQ A) => [A] -> A -> [[[A]] code>.
Peut-être que vous voulez faire un
scission de classe f code> avec
Split :: EQ A => FA -> A -> FA code>, vous pouvez définir une division d'instance
[ ] code>.
Les cours étaient définitivement dans la mauvaise façon de résoudre ce problème - je viens d'inclure ma tentative d'essayer de démontrer ce que j'essayais de faire