-2
Filter :: (Ord a) => [a] -> [a]
 Filter [X:XS] = [[c|c<X, c<-XS ] ++ [X] ++ [c| c >X , c<-XS ]]
 quickSort :: Ord a => [a] -> [a]
 quickSort [] = []
 quickSort [x:xs] = quickSort mini ++ [x] + quickSort maxi
       where
           mini = filter xs
           maxi = filter xs   

具有列表理解的“过滤器”功能是否正确?我知道 Haskell-Libraries 中有一个内置函数“过滤器”。但是我尝试自己编写代码...

4

1 回答 1

6

当您在:构造函数上进行模式匹配时,请使用(x:xs). [x:xs]是不同的东西。

始终将标识符的第一个字母小写。这是 Haskell 中的语法规则,而不仅仅是约定。

filter将类型函数(a -> Bool)作为参数。它不需要Ord a实例。

在列表推导中,生成项x <- xs必须位于使用x(ie p x) 的任何项的左侧。

filter :: (a -> Bool) -> [a] -> [a]
filter p xs = [x | x <- xs, p x]

quickSort :: Ord a => [a] -> [a]
quickSort [] = []
quickSort (x:xs) = quickSort mini ++ [x] ++ quickSort maxi
    where
        mini = filter (< x) xs
        maxi = filter (>= x) xs
于 2019-04-15T00:05:00.220 回答