Haskell concat/过滤器符合特定规则

Haskell concat/过滤器符合特定规则,haskell,higher-order-functions,Haskell,Higher Order Functions,根据以下规则,我试图解决以下问题: 没有递归的定义 没有理解的清单 只允许使用前奏模块。 现在我必须为concat和filter实现高阶 我在这一点上: concat' :: [[a]] -> [a] concat' a = (concat a) filter' :: (a -> Bool) -> [a] -> [a] filter' p [] = [] filter' p (x:xs) | p x = x : filter p xs

根据以下规则,我试图解决以下问题:

没有递归的定义 没有理解的清单 只允许使用前奏模块。 现在我必须为concat和filter实现高阶

我在这一点上:

concat' :: [[a]] -> [a]
concat' a = (concat a)

filter' :: (a -> Bool) -> [a] -> [a]
filter' p [] = []
filter' p (x:xs) 
            | p x = x : filter p xs
            | otherwise = filter p xs
concat函数到目前为止没有什么特别的作用->这是定义的递归吗?我的意思是,我使用标准前奏曲中预定义的concat,但我自己没有定义它——或者我错了

对于过滤器,我已经查找了标准prelude的定义,但它要么不起作用,要么包含递归的定义。

我认为应该避免使用concat和filter函数。如果concat和filter已经可用,为什么我们需要实现它们呢?所以试着从头开始实现它们

我们可以使用递归和列表理解来代替。以下解决方案使用foldr函数

示例:

main = do
  print $ concat' ["A", "B", "CAB"]    -- "ABCAB"
  print $ filter' (\x -> x `mod` 2 == 0) [1..9]  -- [2, 4, 6, 8]
你可以这样做

concat' :: Monad m => m (m b) -> m b
concat' = (id =<<)

filter' p = ((\x-> if p x then [x] else []) =<<)
main = do
  print $ concat' ["A", "B", "CAB"]    -- "ABCAB"
  print $ filter' (\x -> x `mod` 2 == 0) [1..9]  -- [2, 4, 6, 8]
concat' :: Monad m => m (m b) -> m b
concat' = (id =<<)

filter' p = ((\x-> if p x then [x] else []) =<<)
filter' (< 10) [1,2,3,10,11,12]
[1,2,3]