gpt4 book ai didi

haskell - 使用列表理解的带有谓词的自定义过滤器函数

转载 作者:行者123 更新时间:2023-12-02 18:26:09 26 4
gpt4 key购买 nike

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

我的代码基于我擅长的递归示例,但我似乎无法转换为列表理解。无论我输入什么,它都接缝[x | x<-xs, p]它总是抛出编译器错误。我知道p部分是错误的。我试过==p , xs==p以及我能想到的几乎所有其他事情。这让我觉得其他部分可能是错误的,但我真的不确定。

这是我的函数的代码 lcFilter 。我不确定其中部分或全部是否错误,因此我发布了整个内容。

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

如果我输入 lcFilter (>3) [1,2,3,4,5]它应该打印 [4,5]就像标准 Haskell filter 一样功能。

最佳答案

就这么简单

      [x | x <- xs, p x]

由于 p::a -> Boolxs::[a],要获取 bool 值,我们需要应用函数到参数;根据列表理解语义,我们有 x::a

类型推断的应用规则是

            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 , .... ]

其中 {x/y} 表示“将 x 替换为 y”。因此,列表 [a,b,...,n] 根据您的定义转换为

    [  a,           b,          ...,    n        ]             ===>
[ a | p a] ++ [b | p b] ++ ... ++ [n | p n ]

这可以进一步理解/作为monadsmonoids的概念的一个很好的说明,但我们将把它留给另一个人天。 :)

关于haskell - 使用列表理解的带有谓词的自定义过滤器函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56215405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com