У вас уже есть все, что вам нужно здесь. Вы написали
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 xs
для отображения функции f
над списком xs
и bar p xs
для проверки каждого элемента xs
с помощью предиката p
и фильтрации все, что не прошло этот тест (то есть все x
s, что 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)