internalAnd :: Bool -> Bool -> Bool
internalAnd True True = True
internalAnd _ _ = False
(&&) :: Applicative m => m Bool -> m Bool -> m Bool
(&&) = liftA2 internalAnd
-- Usage
greaterThan x = (x <)
lessThan x = (x >)
validateAge = greaterThan 0 && lessThan 120 -- It's really useful with combinators.
我認為在制作組合器等許多情況下定義所有函式很有用Applicative。而applicative是對應于函式能力的適用性的抽象,這樣做似乎也不錯。
定義所有功能的預期問題是什么Applicative?
uj5u.com熱心網友回復:
一個缺點是您現在不能再將它用于普通布林值。所以,你必須寫pure True && pure False而不是True && False. 如果你想得到結果,你必須使用runIdentity :: Identity a -> a或類似的東西。
一個更微妙的問題是您提出的函式不那么懶惰。通常,程式員期望&&短路。所以如果你寫它應該仍然回傳,但False如果你寫False && undefined你的函式會卡住pure False && undefined。真的你想把它實作為一個單子:
(&&) :: Monad m => m Bool -> m Bool -> m Bool
x && y = do
x' <- x
if x
then y
else pure False
一個常見的選擇是給它另一個名字,例如<&&>。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/450923.html
