在Haskell中,对布尔函数执行`and`和`or`
||
我刚刚编写了以下两个函数:
fand :: (a -> Bool) -> (a -> Bool) -> a -> Bool
fand f1 f2 x = (f1 x) && (f2 x)
f_or :: (a -> Bool) -> (a -> Bool) -> a -> Bool
f_or f1 f2 x = (f1 x) || (f2 x)
它们可能用于合并两个布尔函数的值,例如:
import Text.ParserCombinators.Parsec
import Data.Char
nameChar = satisfy (isLetter `f_or` isDigit)
看完这两个功能后,我意识到它们非常有用。如此之多,以至于我现在怀疑它们要么包含在标准库中,要么更有可能使用现有功能来进行清理。
执行此操作的“正确”方法是什么?
没有找到相关结果
已邀请:
7 个回复
厘恼轨
要么
在
应用函子中。 适用版本 为什么?我们有:
所以:
单声道版本 或者对于
,我们有:
所以:
辽躺
和
,不由得想要调整一下:
我认为这些读起来很好。
:对它们应用
后,列表functions14ѭ中的所有功能是否都存在?
:将ѭ15应用于to14ѭ列表中的功能吗?
但是,fOr是一个奇怪的名字选择。当然,这是使那些命令式程序员陷入困境的好人。 =)
亨尖玛次酥
抵浮细
版本可能还不够懒: >
哇! 因此,您可能想要一个稍微不同的功能。请注意,此新功能需要
约束-
是不够的。 >
更好。 至于建议“ 28”功能的答案,这是针对功能相同但参数不同的情况。在给定的情况下,功能不同,但参数相同。这是您的示例经过更改,以使
是一个适当的答案:
可以这样写:
PS:括号是不必要的。
校勒魏寡
(与
无关)分割输入;
是箭头/类别组成。 这是一个例子:
之所以可行,是因为函数
是Category和Arrow的实例。将类型签名与Don's的
和
示例进行比较,可以发现相似之处:
除了循环,还可以用
和
几乎将第一种转换成第二种(另一个区别是
不仅限于在其第一个参数中采用纯函数;虽然可能并不重要)。
你换
对于链中的每个
,您将获得另一个适用于a的函数,然后使用
或ly47ѭ将所有输出汇总在一起。之所以适用于
,是因为它需要两个参数,并且我们将两个函数一起加注星号。如果那里有多余的星星,而另外一张支票,则您必须写出以下内容:
查看更多示例
结乳
在基本Data.Function中
典型用法:
(来自Hoogle)