gpt4 book ai didi

haskell - Haskell 中的高阶 OR

转载 作者:行者123 更新时间:2023-12-03 14:30:46 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Is eta reduction possible?

(4 个回答)


7年前关闭。




这是我正在考虑的一个示例问题:
取从 1 到 n 的每个 x 的总和,其中 x 可以被 3 或 5 整除,所以
像这样:

divisible a b = rem b a == 0
sum3or5 n = sum [x | x <- [1..n], divisible 3 x || divisible 5 x]

来自Scheme,我想使用过滤器来实现这一点,如下所示:
divisible a b = rem b a == 0
sum3or5 n = sum $ filter div3or5 [1..n] where
div3or5 n = (divides 3 n) || (divides 5 n)

我在想,是否有一个高阶逻辑 OR (||),以便我可以编写“div3or5”无点样式,像这样?:
divisible a b = rem a b == 0
sum3or5 = sum $ filter (divisible 3 || divisible 5) . range

感谢您的帮助。

最佳答案

是的。您可以“举”(||)从 bool 值到函数,从某物到 bool 值。所以你想要类似的东西

(||) :: Bool -> Bool -> Bool

变成
(||) :: (r -> Bool) -> (r -> Bool) -> (r -> Bool)

这恰好是函数的应用实例所擅长的。
liftA2      :: (a -> b -> c) -> (r -> a) -> (r -> b) -> (r -> c)

所以
liftA2 (||) :: (r -> Bool) -> (r -> Bool) -> (r -> Bool)

这意味着,在您的情况下,您可以将过滤器编写为
filter (liftA2 (||) (divides 3) (divides 5))

它接受一个整数并决定它是否可以被 3 或 5 整除。

如果你愿意,你可以定义类似的东西
(<||>) = liftA2 (||)

或者,等效地,
f <||> g = \x -> f x || g x

然后你可以把你的过滤器写成
filter (divisible 3 <||> divisible 5)

将尖括号包裹在运算符周围是一种习惯用法,用于表明它们被提升为其他东西(仿函数、应用、幺半群)。

关于haskell - Haskell 中的高阶 OR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23735465/

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