假设我有一个角色c :: Char。现在,我想看看它是否等于a或isDigit:
isAOrDigit = (||) <$> (=='a') <*> (isDigit)
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好。但现在我想看看它是否等于a,isDigit或介于d和g。不幸的是,由于||仅接受2个参数,所以我不能说(||) <$> (=='a') <*> (isDigit) <*> (`elem`['d'..'g'])。
有没有什么好办法可以写这个,还是我必须回到这个:
isACOrDigitOrDG c = c == 'a' || isDigit c || c `elem` ['d'..'g']
Run Code Online (Sandbox Code Playgroud)
?
您可以使用sequence将转换[a -> Bool]为a -> [Bool]。然后,您可以使用or合并该[Bool]值。
isACOrDigitOrDG = or . sequence
[ (== 'a')
, isDigit
, (`elem` ['d'..'g'])
]
Run Code Online (Sandbox Code Playgroud)
您可以解除(||)操作员:
(<||>) = liftA2 (||)
> :t (== 'a') <||> isDigit <||> (`elem` ['d'..'g'])
(== 'a') <||> isDigit <||> (`elem` ['d'..'g']) :: Char -> Bool
> (== 'a') <||> isDigit <||> (`elem` ['d'..'g']) $ 'a'
True
Run Code Online (Sandbox Code Playgroud)