【发布时间】:2020-08-27 00:05:31
【问题描述】:
我在 Haskell 中处理一个简单的闰年练习,我想让我的解决方案没有任何意义。从此开始:
isLeapYear :: Integer -> Bool
isLeapYear year = divisibleBy 400 year || divisibleBy 4 year && not (divisibleBy 100 year)
where
divisibleBy m y = (== 0) $ flip mod m y
我尝试使用liftA3,在this 之后执行(x || (y && z)) 的函数,但测试没有完成,我不知道为什么。
那么,我有 3 个问题:
- 您对我如何实现这一点有任何建议吗?
- 在我的第一个解决方案中,是什么阻止了
divisibleBy无点? (如果我删除参数,类型检查器会抱怨) - 正如我之前提到的,我尝试了类似
liftA3 (\x y z -> x || (y && z)) (divisibleBy 400) (divisibleBy 4) (indivisibleBy 100)的方法,但测试挂起。为什么会这样?我不明白liftA3的工作原理。
非常感谢您的帮助。
【问题讨论】:
-
你不应该总是使用它,但是... pointfree.io
-
所以应该是:
isLeapYear = ap ((||) . divisibleBy 400) (ap ((&&) . divisibleBy 4) (not . divisibleBy 100))。可读性差,但略短。 -
我明白了,谢谢!我想知道是否有一种方法可以在不牺牲太多可读性的情况下实现这一点,也许是通过一些我还不知道的功能。 pointfree.io 版本看起来有点过头了。
-
flip mod m y似乎是多余的。这个更好:mod y m -
让表达变得无意义并不是一件纯粹的好事。
标签: haskell applicative pointfree