У вас много обходных путей.
Если вы не знаете какого-либо связующего синтаксиса, кроме лямбда-выражений, вы можете сделать это (что мне нравится больше всего из-за его теоретической красоты, но никогда не использовать из-за его синтаксического уродства):
integrate f
= \a b -> (\d -> d * sum [ f (a + d*k) | k <- [0..n] ] - d/2.0 * (f a + f b))
((b - a) / n)
where
n = 1000
Если вам нравятся определения и вы знаете только where
-синтаксис, вы можете сделать это:
integrate f = go
where
n = 1000
go a b = d * sum [ f (a + d*k) | k <- [0..n] ] - d/2.0 * (f a + f b)
where
d = (b - a) / n
Если вы также знаете let
-синтаксис, вы можете сделать это:
integrate f =
\a b -> let d = (b - a) / n
in d * sum [ f (a + d*k) | k <- [0..n] ] - d/2.0 * (f a + f b)
where
n = 1000
Наконец, если вы помните, что a -> (b -> c -> d)
совпадает с a -> b -> c -> d
, вы можете сделать очевидное:
integrate f a b = d * sum [ f (a + d*k) | k <- [0..n] ] - d/2.0 * (f a + f b)
where
n = 1000
d = (b - a) / n