gpt4 book ai didi

list - 如何在 Haskell 中组合过滤器和映射

转载 作者:行者123 更新时间:2023-12-05 04:01:02 24 4
gpt4 key购买 nike

我正在用 haskell 做一些练习。我的任务是创建一个偶数平方列表,列表中没有 0 [0..10] .

我已经用 Haskell 中的列表理解实现了它(请看下面的代码块。)但现在我的任务是用函数 map 来实现它和 filter .

List comprehension in Haskell:
[x^2 | x <- [0..10], mod x 2==0, x/=0]


f = (\x -> (x^2))
p = (\x -> mod x 2 == 0 && x/=0)

map1 :: (a->b) -> [a] -> [b]
map1 f [] = []
map1 f (x:xs) = f x : map1 f xs

filter1 :: (a -> Bool) -> [a] -> [a]
filter1 p [] = []
filter1 p (x:xs)
| p x = x:filter p xs
| otherwise = filter1 p xs

我实现了 mapfilter函数(我知道这是多余的但它实践了我)并且我有一个平方函数。现在的问题是结合 mapfilter我也得到一个 errorp = (\x -> mod x 3 == 0 && x/=0) 留言.

我的错误信息是 <interactive>:4:1: error: Variable not in scope : p :: Integer -> t

最佳答案

您在这里已经拥有了所需的一切。你写了

let res = [ x^2 | x <- [0..10], <b>mod x 2==0</b>, <b>x/=0</b> ]

但这意味着你也可以写

let res = [ y^2 | y <- [ x | x <- [0..10] 
, <b>(mod x 2==0 && x/=0)</b> ] ]
~=
let res = [ y^2 | y <- [ x | x <- [0..10], <b>test x</b> ] ]
where
<b>test x</b> = (mod x 2==0 && x/=0)
~=
let res = [ y^2 | y <- baz <b>[0..10]</b> ]
where
baz <b>xs</b> = [ x | x <- <b>xs</b>, test x ]
test x = (mod x 2==0 && x/=0)
~=
let res = [ sqr y | y <- bar <b>test</b> [0..10] ]
where
sqr y = y^2
bar <b>p</b> xs = [ x | x <- xs, <b>p</b> x ]
test x = (mod x 2==0 && x/=0)
~=
let res = quux <b>( bar test [0..10] )</b>
where
quux <b>ys</b> = [ sqr y | y <- <b>ys</b> ]
sqr y = y^2
bar p xs = [ x | x <- xs, p x ]
test x = (mod x 2==0 && x/=0)
~=
let res = foo <b>sqr</b> ( bar test [0..10] )
where
foo <b>f</b> ys = [ <b>f</b> y | y <- ys ]
sqr y = y^2
bar p xs = [ x | x <- xs, p x ]
test x = (mod x 2==0 && x/=0)

现在我们有了两个函数,foo f ys 用于将函数 f 映射到列表 ys bar p xs 用于通过谓词 p 测试 xs 的每个元素并过滤掉所有未能通过该测试的元素(即所有 x 使得 p x == False)。而且,事实证明,我们已经了他们的定义!

我们从原始代码中提取它们所需要做的就是抽象

let res = <b>map</b> sqr ( <b>filter</b> test [0..10] )
where
sqr y = y^2
test x = (mod x 2==0 && x/=0)

关于list - 如何在 Haskell 中组合过滤器和映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55674656/

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