【发布时间】:2017-08-11 09:54:34
【问题描述】:
我只是想对我的 Haskell 代码进行总体改进,并且想知道是否可以使以下函数变得无点?主要是为了好奇。
鉴于我们想在filter 中使用的两个函数:
isZero = (==0)
isOne = (==1)
我们将如何在我们设计的示例中使用这两个函数,但使其无意义?
filter (\x -> isZero x || isOne x) [0..100]
【问题讨论】:
-
作为实例,
filter ((||) <$> isZero <*> isOne) [0..100]。将(||)提升到这样的应用函子:(<||>) = liftA2 (||)。然后使用:filter (isZero <||> isOne <||> ...) ... -
请注意,
(||) <$> isZero <*> isOne是 25 个字符,\x -> isZero x || isOne x是 25 个字符。我会坚持使用有意义的版本,它更容易被人类阅读。 -
@freestyle 我爱
<||>。希望它不会在其他地方使用不同的含义...... -
@Bergi 在一些包中已经定义了,例如:control-bool, classy-prelude。
-
@freestyle:我倾向于将
liftA2 (||)拼写为.||.,因为从记忆上讲,两边都有一个“点”。如果你真的很喜欢 APL 风格的默认编程,你可以添加像(..||..) = liftA2 (liftA2 (||))这样愚蠢的概括,它允许像(>=) = (>) ..||.. (==)这样的事情(“'大于或等于'意味着'大于'或'等于'”) .
标签: haskell