Haskell 使用列表理解的带谓词的自定义筛选函数

Haskell 使用列表理解的带谓词的自定义筛选函数,haskell,filter,list-comprehension,higher-order-functions,Haskell,Filter,List Comprehension,Higher Order Functions,我需要开发我自己的过滤函数,类似于Haskell中的filter工作原理,但使用列表理解和谓词。所以我会把lcFilter(>3)[1,2,3,4,5,6,10444,3]放在ghci中,它会打印所有大于3的数字 我的代码基于一个递归示例,我很擅长这个示例,但我似乎无法转换为列表理解。无论我在[x | x Bool)->[a]->[a]中输入什么,它都会接合 lcFilter[]=[] lcFilter p(x:xs)=[x | x3)[1,2,3,4,5]它应该像标准Haskell过滤器一样打

我需要开发我自己的过滤函数,类似于Haskell中的
filter
工作原理,但使用列表理解和谓词。所以我会把
lcFilter(>3)[1,2,3,4,5,6,10444,3]
放在ghci中,它会打印所有大于3的数字

我的代码基于一个递归示例,我很擅长这个示例,但我似乎无法转换为列表理解。无论我在
[x | x Bool)->[a]->[a]中输入什么,它都会接合
lcFilter[]=[]
lcFilter p(x:xs)=[x | x3)[1,2,3,4,5]
它应该像标准Haskell
过滤器一样打印
[4,5]

它与

      [x | x <- xs, p x]
你不需要模式匹配,列表理解会解决这个问题

所以总的来说是这样的

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

这可以用单子或幺半群的概念作一个很好的说明来进一步理解,但我们将把它留到另一天再说。

“它总是引发编译器错误”之后应该是完整的错误信息。发布您收到的错误对潜在的回答者非常有用。请记住这一点,以便将来提问。
            x :: a
          p   :: a -> b
         ---------------
          p x ::      b
lcFilter :: (a -> Bool) -> [a] -> [a]
lcFilter p xs = [x | x <- xs, p]
    [ ... | x <- (xs            ++                ys), .... ]  ===
    [ ... | x <-  xs, ....  ]   ++   [ ... | x <- ys , .... ]
    [ ... | x <- ([y]           ++                ys), .... ]  ===
    [ ... | x <-  [y], .... ]   ++   [ ... | x <- ys , .... ]  ===
    [ ...{x/y} | ....{x/y}  ]   ++   [ ... | x <- ys , .... ]  
    [  a,           b,          ...,    n        ]             ===>
    [  a | p a] ++ [b | p b] ++ ... ++ [n | p n  ]