试图创建一个函数,它接受一个列表并返回与其第一个元素相同的所有元素的列表,但我的函数不起作用

jaz*_*iac 4 haskell list

特别是一个字符串.所以它会采取["so", "what", "and", "so", "for" "so"]并返回["so", "so", "so"].我的问题是我的函数返回一个与输入的列表相同的列表.

这是所有相关的代码:

lookAhead :: [String] -> String
lookAhead [] = []
lookAhead (c:cs) = c

groupFirst :: [String] -> [String]
groupFirst [] = []
groupFirst (x:xs) 
    | lookAhead xs == x  = x : (groupFirst ((lookAhead xs):(tail xs)))
    | lookAhead xs /= x  = x : (groupFirst xs)
    | lookAhead xs == [] = x : []
Run Code Online (Sandbox Code Playgroud)

小智 6

trail作为头元素 - 等式 - 谓词filter:

trail :: Eq a => [a] -> [a]
trail []       = []
trail (x : xs) = x : filter (== x) xs
Run Code Online (Sandbox Code Playgroud)

trailBy使用Schwartzian变换memoization:

trailBy :: Eq b => (a -> b) -> [a] -> [a]
trailBy _ []        = []
trailBy f (x1 : xs) = let x1f = f x1
                      in  x1 : filter (\ x -> f x == x1f) xs
Run Code Online (Sandbox Code Playgroud)

trail = trailBy id,在哪里id x = x,Haskell的身份功能.

  • 虽然它们不会在这里造成崩溃,但"头部"和"尾部"都是邪恶的.避免他们.通过模式匹配处理这两种情况,然后在给出空列表时决定你要做什么.(这也适用于其他答案.) (6认同)